我正在尝试绘制一个图形,其中大多数数据点都是正常绘制的,但有一组数据点使用不同大小的符号。我希望图例也能显示相同的效果:大多数点正常显示,但异常点用不同大小的符号绘制。以下是一小段代码:
library(ggplot2)
x = c(1,2,1,2,3)
y = c(1,2,3,4,3)
vendor = c("x", "x", "y", "y", "z")
df = data.frame(x,y,vendor)
p <- ggplot(df) +
aes_string(x="x", y="y", color="vendor") +
geom_point(size=3, data=subset(df, vendor!="z")) +
geom_point(size=5, data=subset(df, vendor=="z"))
ggsave("foo.pdf")
问题在于,在生成的图例中,所有点都用较大的(
size=5
)符号绘制,而不仅仅是那些属于厂商z的点。我希望在图例中使用较大的点绘制厂商z的点,并使用size=3
绘制其他点。(奖励问题:我真正想要的是一个更大的粗轮廓符号:不是圆圈,我想要一个甜甜圈。我知道
shape=2
可以绘制轮廓圆,但非常细。我宁愿有一个更粗的轮廓圆。我也想用三角形做同样的事情。有什么简单的方法吗?)也许我应用得不对,但按照这个建议:ggplot2: Making changes to symbols in the legend 的方法加上 "guides" 行也没有帮助:
guides(size = guide_legend(override.aes = list(shape = 1)))
即相同的输出,在图例中所有三个供应商的符号大小为
5
。编辑后:非常好的答案,我很快就实现了。现在我已经添加了几行:
library(ggplot2)
x = c(1,2,1,2,3)
y = c(1,2,3,4,3)
vendor = c("x", "x", "y", "y", "z")
df = data.frame(x,y,vendor)
df$vendor_z <- df$vendor=="z" # create a new column
ggplot(df) +
aes_string(x = "x", y = "y", color = "vendor", size = "vendor_z") +
geom_point() +
geom_line(size=1.5) + # this is the only difference
scale_size_manual(values = c(3, 5), guide = FALSE)
guides(colour = guide_legend(override.aes = list(size = c(3, 3, 5))))
ggsave("foo.pdf")
现在图例的大小已经恢复到3,包括那些带有供应商z的点。有什么解决方法吗?