将参考点和参考线添加到geom_line()图中

时间:2020-05-18 16:41:33

标签: r ggplot2

我有一个像`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

enter image description here

我想强调这一点上的“兴趣点”。我要突出显示poi1红色的点,poi2蓝色的点和poi3绿色的点。我可以使用geom_vline()使它们全部垂直:

p+
  geom_vline(xintercept =poi1, color="red")+
  geom_vline(xintercept = poi2, color = "blue")+
  geom_vline(xintercept = poi3, color = "green")

但是我实际上希望poi1poi2的点是蓝色和红色点(而不是线,而将poi3留为垂直绿线)或geom_vline完成的操作的“较短”版本(黑线上方和下方)。我无法让geom_point()正常运行并执行此操作。我是否需要以其他方式设置格式,或者该如何完成? 另外,接下来如何在图的上角添加图例,以表示哪条线/点和颜色表示哪一组poi?例如,如果它们是点(加上绿线),它将有一个红点,并在单词“ poi2”旁边说一个“ poi1”蓝色点,在作品“ poi3”旁边说一个小绿线

1 个答案:

答案 0 :(得分:0)

添加彩色点的最直接方法可能是分别调用geom_point并提供poi1poi2poi3作为子集化方法情节。

所以,代码看起来像这样:

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)

enter image description here

这里的一个问题是,没有提到那些颜色应该是什么(例如...一个图例)。如果要添加它,可以将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'))

enter image description here

没有手动颜色分配。 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)

enter image description here

添加垂直线并将其显示在图例中

与该解决方案的注释中的后续问题有关:如何为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'))

enter image description here

绿线被添加到图例中,但在所有点“后面”被添加为线+点。我们想要的是一个单独的图例。 ggplot2尝试在可能的地方合并图例。我们要做的是一种作弊,就是强迫ggplot2linetype创建另一个图例,然后将color='green2'设置在{{ 1}}呼叫。这将从为“颜色”创建的图例中删除行的颜色,并为“线型”添加另一个图例,仅显示我们的行。最终的解决方法是通过aes()设置geom_vline的值。由于这里只有一个键,因此您只需要一个值。

linetype

enter image description here