Воспроизвести график с помощью ggplot

#r #ggplot2

#r #ggplot2

Вопрос:

Я пытаюсь воспроизвести график с помощью ggplot.

Код, который я получил из учебника:

 skeptic<-c(1,1.171,1.4,1.8,2.2,2.6,3,3.4,3.8,3.934,4.2,
4.6,5,5.4,5.8,6.2,6.6,7,7.4,7.8,8.2,8.6,9)

effect<-c(-.361,-.327,-.281,-.200,-.120,-.039,.041,.122,.202,.229,.282,
.363,.443,.524,.604,.685,.765,.846,.926,1.007,1.087,1.168,1.248)

llci<-c(-.702,-.654,-.589,-.481,-.376,-.276,-.184,-.099,-.024,0,.044,.105,
.161,.212,.261,.307,.351,.394,.436,.477,.518,.558,.597)

ulci<-c(-.021,0,.028,.080,.136,.197,.266,.343,.428,.458,.521,.621,.726,.836,
.948,1.063,1.180,1.298,1.417,1.537,1.657,1.778,1.899)

plot(x=skeptic,y=effect,type="l",pch=19,ylim=c(-1,1.5),xlim=c(1,6),lwd=3,
ylab="Conditional effect of disaster frame",
xlab="Climate Change Skepticism (W)")
points(skeptic,llci,lwd=2,lty=2,type="l")
points(skeptic,ulci,lwd=2,lty=2,type="l")
abline(h=0, untf=FALSE,lty=3,lwd=1)
abline(v=1.171,untf=FALSE,lty=3,lwd=1)
abline(v=3.934,untf=FALSE,lty=3,lwd=1)
text(1.171,-1,"1.171",cex=0.8)
text(3.934,-1,"3.934",cex=0.8)
 

Примерный график
введите описание изображения здесь

Я пробовал ggplot, но у меня проблемы с вертикальной и горизонтальной пунктирной линией. Может ли кто-нибудь воспроизвести график с помощью ggplot? И у меня есть дополнительный вопрос. Как я могу отметить область x <3,934 и x> 1,171? Спасибо!

Ответ №1:

Вот способ воспроизведения опубликованного графика.

 library(ggplot2)
library(magrittr)
library(tidyr)

df1 <- data.frame(skeptic, effect, llci, ulci)
vlines <- data.frame(x = c(0, 1.171, 3.934))
vertices <- data.frame(xmin = 1.171, xmax = 3.934,
                        ymin = -Inf, ymax = Inf)

brks <- names(df1)[-1]

df1 %>%
  pivot_longer(-skeptic, names_to = "line") %>%
  ggplot(aes(skeptic, value))  
  geom_rect(data = vertices,
            mapping = aes(xmin = xmin, xmax = xmax, 
                          ymin = ymin, ymax = ymax),
            fill = "blue", alpha = 0.2,
            inherit.aes = FALSE)  
  geom_line(aes(size = line, linetype = line))  
  geom_hline(yintercept = 0, linetype = "dotted")  
  geom_vline(data = vlines, 
             mapping = aes(xintercept = x), 
             linetype = "dotted")  
  geom_text(data = subset(vlines, x != 0),
            mapping = aes(x = x, label = x), 
            y = -0.75,
            hjust = 0, vjust = 1)  
  scale_size_manual(breaks = brks, values = c(1, 0.5, 0.5))  
  scale_linetype_manual(breaks = brks, values = c("solid", "dashed", "dashed"))  
  theme_bw()  
  theme(panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank())
 

введите описание изображения здесь

Ответ №2:

Построение по вашему конкретному вопросу (горизонтальные и вертикальные линии и область), как вы сказали, у вас уже есть правильные части.

Используйте geom_hline для горизонтальной линии и geom_vline для вертикальной. linetype="dashed" отобразит пунктирные линии. Поскольку вы не указали, как вы хотите отобразить область, вот мое предположение, вертикальная серая область, простирающаяся по горизонтали от абцисс ваших вертикальных линий и по вертикали от минимального эффекта до максимального эффекта ( Inf значений), нарисованного с помощью a geom_rect .

 ggplot(data.frame(skeptic,effect)) 
  geom_line(aes(skeptic,effect)) 
  geom_rect(aes(xmin=1.171,xmax=3.934,ymin=-Inf,ymax=Inf),fill="lightgray") 
  geom_hline(yintercept=0,linetype="dashed")  
  geom_vline(xintercept=c(1.171,3.934),linetype="dashed")