【问题标题】:Adding reference points and lines to a geom_line() plot将参考点和线添加到 geom_line() 图
【发布时间】:2020-05-18 16:41:33
【问题描述】:

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

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

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    添加彩色点最直接的方法可能是分别调用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)
    

    这里的一个问题是没有提及这些颜色应该是什么(如...传说)。如果您想添加它,您可以将 color= 放在 aes(...) 中,以便创建一个图例键,并在其中分配 键项的名称(例如aes(color="name of item 1"))。然后,您需要调用 scale_color_manual(...) 来专门设置颜色...或者您可以不使用 scale_color_manual 对象,而是将其留给 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) +
      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= 设置为poi3ggplot 想要接收data= 的数据帧,所以在下面的代码中你会看到我通过as.data.frame(... 强制转换。强制数据框生成一个包含 2 个观察值的数据框,其中一列称为“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 尝试在可能的情况下合并图例。我们要做的是一种欺骗,即强制ggplot2linetype 创建另一个图例,并在geom_vline 调用中将color='green2' 设置在aes() 之外。这将从为“颜色”创建的图例中删除线的颜色,并为“线型”添加另一个图例,仅显示我们的线。最后的解决方法是通过scale_manual_linetype 设置linetype 的值。由于这里只有一个键,因此您只需要一个值。

    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, linetype='poi3'),
        color='green2', size=1) +
    scale_color_manual(values=list('poi1'='red','poi2'='blue')) +
    scale_linetype_manual(values=2)
    

    【讨论】:

    • 哦,还有@Ryan,如果你想要一个垂直线穿过它的点,你可以使用geom_pointrange - 如果你这样做,在这个特定的情节中很难辨认出来。
    • 感谢这是很好的解释。如果我想将poi3 保留为垂直线(由geom_vline() 创建),我将如何将其添加到图例中(这将是图例中的绿线,而不是点)
    • 我在您更新评论之前发表了该评论,谢谢!
    • 嗨@Ryan - 我在问题中添加了其他信息,解决了如何添加geom_vline()(除了geom_point 调用)。希望它对您有用:如果您对格式等有其他问题,我会提出另一个问题,您可以链接回此处并告诉我。我也很乐意在那里提供答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    相关资源
    最近更新 更多