我有一个像`dat1这样的数据框:
dat1 <- data.frame(idx = 1:200,
fit = rnorm(200,10,0.5))
cis <- data.frame(uci=dat1$fit+0.5,
lci = dat1$fit-0.5)
dat1 <- cbind(dat1,cis)
我还有3个其他对象,在其中存储了dat1的“兴趣点”(或poi1:3
)。
poi1 <- c(30,59,120,150)
poi2 <- c(10,42,110,165,190)
poi3 <- c(50, 100)
我使用以下代码绘制了dat1
的带置信带的线图:
p<-
ggplot(dat1, aes(x=idx, y=fit))+
geom_line()+
geom_ribbon(aes(ymin = lci, ymax = uci), alpha = 0.3)+
labs(x="Distance", y="Var1")
p
我想强调这一点上的“兴趣点”。我要突出显示poi1
红色的点,poi2
蓝色的点和poi3
绿色的点。我可以使用geom_vline()
使它们全部垂直:
p+
geom_vline(xintercept =poi1, color="red")+
geom_vline(xintercept = poi2, color = "blue")+
geom_vline(xintercept = poi3, color = "green")
但是我实际上希望poi1
和poi2
的点是蓝色和红色点(而不是线,而将poi3
留为垂直绿线)或geom_vline
完成的操作的“较短”版本(黑线上方和下方)。我无法让geom_point()
正常运行并执行此操作。我是否需要以其他方式设置格式,或者该如何完成?
另外,接下来如何在图的上角添加图例,以表示哪条线/点和颜色表示哪一组poi
?例如,如果它们是点(加上绿线),它将有一个红点,并在单词“ poi2”旁边说一个“ poi1”蓝色点,在作品“ poi3”旁边说一个小绿线
答案 0 :(得分:0)
添加彩色点的最直接方法可能是分别调用geom_point
并提供poi1
,poi2
和poi3
作为子集化方法情节。
所以,代码看起来像这样:
p +
geom_point(data=dat1[which(dat1$idx %in% poi1),], color='red', size=3) +
geom_point(data=dat1[which(dat1$idx %in% poi2),], color='blue', size=3) +
geom_point(data=dat1[which(dat1$idx %in% poi3),], color='green', size=3)
这里的一个问题是,没有提到那些颜色应该是什么(例如...一个图例)。如果要添加它,可以将color=
放在aes(...)
内,以便创建图例键,并分配键项目的 名称 内(例如aes(color="name of item 1")
)。然后,您需要调用scale_color_manual(...)
来专门设置颜色...或者您可以不使用scale_color_manual
对象,而只需将其留给ggplot
来确定配色方案。 / p>
在图例中手动分配颜色:
p +
geom_point(data=dat1[which(dat1$idx %in% poi1),], aes(color='poi1'), size=3) +
geom_point(data=dat1[which(dat1$idx %in% poi2),], aes(color='poi2'), size=3) +
geom_point(data=dat1[which(dat1$idx %in% poi3),], aes(color='poi3'), size=3) +
scale_color_manual(values=list('poi1'='red','poi2'='blue','poi3'='green'))
没有手动颜色分配。 ggplot
仅使用主题的默认调色板。
p +
geom_point(data=dat1[which(dat1$idx %in% poi1),], aes(color='poi1'), size=3) +
geom_point(data=dat1[which(dat1$idx %in% poi2),], aes(color='poi2'), size=3) +
geom_point(data=dat1[which(dat1$idx %in% poi3),], aes(color='poi3'), size=3)
与该解决方案的注释中的后续问题有关:如何为xintercept = poi3添加垂直线,并在图例中显示该垂直线?
您可以将单独的呼叫添加到geom_vline
,并为xintercept=
添加单独的值,但是如果您有很多话,这只是一种不好的做法。更好的做法是在将geom_vline
设置为data=
的情况下进行一次poi3
呼叫。 ggplot
希望以data=
的形式接收数据帧,因此在下面的代码中,您将看到我通过as.data.frame(...
强制执行此转换。强制一个数据框使一个带有2个观测值的datframe带有称为“ poi3”的一列,因此这就是我们将其指定为xintercept=
美学的原因。可行...但是您会发现它不太正确:
p +
geom_point(data=dat1[which(dat1$idx %in% poi1),], aes(color='poi1'), size=3) +
geom_point(data=dat1[which(dat1$idx %in% poi2),], aes(color='poi2'), size=3) +
geom_vline(data=as.data.frame(poi3), aes(xintercept=poi3, color='poi3'),
linetype=2, size=1) +
scale_color_manual(values=list('poi1'='red','poi2'='blue','poi3'='green2'))
绿线被添加到图例中,但在所有点“后面”被添加为线+点。我们想要的是一个单独的图例。 ggplot2
尝试在可能的地方合并图例。我们要做的是一种作弊,就是强迫ggplot2
为linetype
创建另一个图例,然后将color='green2'
设置在{{ 1}}呼叫。这将从为“颜色”创建的图例中删除行的颜色,并为“线型”添加另一个图例,仅显示我们的行。最终的解决方法是通过aes()
设置geom_vline
的值。由于这里只有一个键,因此您只需要一个值。
linetype