在ggplot2中使用geom_point()和geom_line()绘制同一图表上的多个数据集。

36

我尝试将三个数据集绘制到同一张图上。其中一个数据集应该只出现在图上作为一组不相连的点,而另外两个数据集应该出现为相连的数据点。 我可以使用以下代码构建图表:

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")

代码中显示了两组用"type = '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")

使用此命令,红色点会相互连接,蓝色点会相互连接,而绿色点则不会连接。但是,我不想这样做,因为我希望能够在图例中显示所有点的颜色(在此解决方案中没有图例显示)。


1
当我尝试运行你的示例脚本时,我发现了一个小错误。在其中 aes(x.value, color = L1) 的地方应该为 aes(x,value, color = L1) - pedromanoel
谢谢,你的问题也帮到了我。 - Aquarius_Girl
2个回答

41

诀窍在于每个图层都可以有自己的数据集。因此,您必须对数据进行子集处理,以从提供给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


11

您可以将不同的数据集输入到每个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")) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接