首页 文章

geg_lot()和geom_line()用于ggplot2中同一图形上的多个数据集

提问于
浏览
31

我正在尝试将三个数据集绘制到同一个图表上 . 一个数据集应该在图表上显示为一组未连接的点,而另外两个应该显示为连接的数据点 . 我可以使用以下代码构建图形:

x <- c(1,2,3,4)
y <- c(1.1,1.2,1.3,1.4)
y2 <- c(2.1,2.2,2.3,2.4)
x3 <- c(4,5,6,7)
y3 <- c(3.1,3.2,3.3,3.2)
p1 <- data.frame(x=x,y=y)
p2 <- data.frame(x=x,y=y2)
p3 <- data.frame(x=x3,y=y3)

plot(x,y,type="o", col="red")
points(x3,y3,col="darkgreen",pch=16)
points(x,y2,type="o",col="blue")

如代码所示,有两组用“o”类型绘制的点,这意味着这些点通过一条线连接,其中一组点没有用一条线连接 . 我试图在ggplot2中重新创建它 . 我在ggplot2中执行以下操作:

zz <- melt(list(p1=p1,p2=p2,p3=p3), id.vars="x")
ggplot(zz, aes(x.value, color = L1)) 
+ geom_point() + scale_color_manual("Dataset", 
values = c("p1" = "darkgreen", "p2" = "blue", "p3" = "red"))

做到这一点,我得到三种不同颜色的三组点,当然红色和蓝色点分别没有连接 . 如果我想连接点我可以将geom_line()添加到上面的命令,以便我有以下内容:

ggplot(zz, aes(x.value, color = L1)) + geom_point() + 
scale_color_manual("Dataset", values = 
c("p1" = "darkgreen", "p2" = "blue", "p3" = "red")) + geom_line()

当然,这导致连接所有点的线,使得所有红点彼此连接,所有蓝点彼此连接,并且所有绿点彼此连接 . 但是,虽然我希望连接红色和蓝色点,但我不希望连接绿色点 . 有没有办法做到这一点?

我可以做以下(或类似):

ggplot(p2, aes(x,y)) + geom_point(color = "blue") + geom_line(color="blue") 
+ geom_point(data=p3, color = "red") + 
geom_line(data=p3, color="red") + geom_point(data=p1, color = "darkgreen")

使用此命令,连接红点,连接蓝色,并断开绿色 . 但是,我不想这样做,因为我希望能够让所有的颜色点都出现在图例中(此解决方案中不会出现任何图例) .

2 回答

  • 10

    诀窍是每个图层都可以拥有自己的数据集 . 因此,您必须对数据进行子集化,以便从提供给 geom_line 的数据中排除 L1=="p1"

    ggplot(zz, aes(x, y=value, color=L1)) + 
      geom_point() + 
      geom_line(data=zz[zz$L1!="p1", ]) +
      scale_color_manual("Dataset", 
           values = c("p1" = "darkgreen", "p2" = "blue", "p3" = "red"))
    

    enter image description here

  • 36

    您可以将不同的数据集提供给每个geom . 因此,您可以将除p1之外的数据集传递到geom_line图层 . 像这样的东西应该工作:

    ggplot(zz, aes(x, value, color = L1)) + 
      geom_point() + 
      geom_line(data = subset(zz, L1 %in% c("p2", "p3")), aes(group = L1)) +
      scale_color_manual("Dataset", values = c("p1" = "darkgreen", "p2" = "blue", "p3" = "red"))
    

相关问题