如果我有两个数据集,我想把它们画成一条线穿过的点,我可以很简单地用这样的代码来完成。
library(ggplot2)
xdata = c(1,2,3,4,5,6)
ydata = xdata^2
ydata2 = 2^xdata
xydata = data.frame(xdata,ydata)
ggplot(xydata) +
geom_path(aes(x=xdata,y=ydata,color="x^2"),size=1) +
geom_point(aes(x=xdata,y=ydata,color="x^2"),size=2) +
geom_path(aes(x=xdata,y=ydata2,color="2^x"),size=1) +
geom_point(aes(x=xdata,y=ydata2,color="2^x"),size=2)
这将导致this plot。图例正确显示点和路径以及它们的颜色。现在,我想分别更改线和点,并使这些更改反映在图例中。但我不确定如何执行此操作。如果我尝试天真地更改路径的线型和点的颜色,这些更改不会保留到图例中。
library(ggplot2)
xdata = c(1,2,3,4,5,6)
ydata = xdata^2
ydata2 = 2^xdata
xydata = data.frame(xdata,ydata)
ggplot(xydata) +
geom_path(aes(x=xdata,y=ydata,color="x^2"),size=1) +
geom_point(aes(x=xdata,y=ydata,color="x^2"),size=2,color="black") +
geom_path(aes(x=xdata,y=ydata2,color="2^x"),size=1,linetype="dashed") +
geom_point(aes(x=xdata,y=ydata2,color="2^x"),size=2)
导致this plot。我理解为什么会这样,但是我不知道一个好的方法(意思是一般的/干净的方法)来修复图例以匹配geom_point和geom_line。这看起来会是something like this。
我希望有一个快速的方法来完成这个任务,或者至少是一个简单的方法。我已经尝试了aes(填充),scale_color_manual,scale_linetype_manual和融化数据,但是一直无法得到我想要的。谢谢。
2条答案
按热度按时间ryevplcw1#
这很棘手,因为ggplot2使用“color”来控制geom_line颜色和geom_point颜色,所以我不知道一种直接的方法来混合它们并让图例反映出来。
这里的一个技巧是使用一个带有fill的geom_point形状(例如21),然后使用“fill”来代替。要使颜色和填充图例相合并,我们需要给予它们相同的名称。要使一条线为黑色,我们可以使用
scale_fill_manual
并指定两个点的颜色。rdrgkggo2#
ggplot2中的图例反映了视觉质量(例如颜色、线型)是如何Map到数据的,因此,如果有数据可以回答“这应该是什么颜色?"的问题,那么就更容易了。因此,最好将所有“y”数据放在一个长列中,并使用另一个列来解释每个值属于哪个组,以便颜色和线型可以Map到该列。
由reprex package(v2.0.1)于2023年1月31日创建