添加彩色点最直接的方法可能是分别调用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 +
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 个观察值的数据框,其中一列称为“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 创建另一个图例,并在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)