R ggplot2:使图例中的符号与绘图中的符号匹配

R ggplot2:使图例中的符号与绘图中的符号匹配,r,ggplot2,legend,R,Ggplot2,Legend,我试着做一个绘图,大多数数据点都是正常绘制的,但是一组数据点有不同大小的符号。我希望图例显示相同的内容:大多数点正常显示,但例外情况是使用不同大小的符号绘制的。下面是一段简短的代码: 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"

我试着做一个绘图,大多数数据点都是正常绘制的,但是一组数据点有不同大小的符号。我希望图例显示相同的内容:大多数点正常显示,但例外情况是使用不同大小的符号绘制的。下面是一段简短的代码:

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")
i、 e.相同的输出,图例中所有三个供应商的
size=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")
库(ggplot2)
x=c(1,2,1,2,3)
y=c(1,2,3,4,3)
供应商=c(“x”、“x”、“y”、“y”、“z”)
df=数据帧(x,y,供应商)

df$vendor_z由于
size
aes_字符串
之外,因此该大小不应用于图例。此外,如果您创建一个额外的列来指示
vendor==“z”
,那么使用
ggplot
的工作将更加容易

以下是第1部分的解决方案:

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() +
  scale_size_manual(values = c(3, 5), guide = FALSE) + 
  guides(colour = guide_legend(override.aes = list(size = c(3, 3, 5))))
这里,使用
geom_point
和数据子集(
df[df$vendor_z,]
)绘制单个点。我选择了
size
3
,因为这是较小圆圈的值。
形状
21
是一个可以指定
填充
颜色的圆。最后,
show\u guide=FALSE
避免了图例特征被新的
形状所覆盖

编辑:第3部分:添加线

您可以使用参数
show\u guide=FALSE
抑制
geom\u line
的图例:

ggplot(df) +
  aes_string(x = "x", y = "y", color = "vendor", size = "vendor_z") +
  geom_point() +
  geom_line(size=1.5, show_guide = FALSE) +   # 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))))

顺便说一句,我是一个彻头彻尾的RN00B,所以请随意评论我的代码并帮助我改进它!谢谢斯文!多好的回答啊。我补充了一点问题,问如何使这项工作与geom_线以及。在甜甜圈。。。有没有办法让甜甜圈也出现在传说中?干得好,在蓝色圆圈上画白色。@jowens我用一个包含线条的解决方案扩展了答案。在图例中三个符号中的一个符号的蓝色圆圈上方绘制白色是很困难的,可能涉及到情节之外的黑客攻击。如果我能找到答案,我会让你知道的。这是一个非常体贴和亲切的回答,并愉快地接受了。如果有人想插话,我想看看的是:1)我真的很在乎传说中的台词;在我的完整图表中,我有实线和虚线;2) 如果我不必硬编码size=c(3,3,5),那么代码中似乎更一般,因为如果我添加另一个供应商的数据,我必须手动更改它;3) 我在这里真正要做的是显示供应商z是供应商y的一个例外情况,所以我希望z看起来更像y,但稍有不同,并且不与y的线条相连。如果有人想看看我试图解决的实际问题,我在上发布了一个简短的自述,其中包含源代码和结果图。
ggplot(df) +
  aes_string(x = "x", y = "y", color = "vendor", size = "vendor_z") +
  geom_point() +
  geom_point(data = df[df$vendor_z, ], aes(x = x, y = y),
             size = 3, shape = 21, fill = "white", show_guide = FALSE) +
  scale_size_manual(values = c(3, 5), guide = FALSE) + 
  guides(colour = guide_legend(override.aes = list(size = c(3, 3, 5))))
ggplot(df) +
  aes_string(x = "x", y = "y", color = "vendor", size = "vendor_z") +
  geom_point() +
  geom_line(size=1.5, show_guide = FALSE) +   # 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))))