#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")