ggplot2:在图例中创建符号匹配图中的符号

时间:2012-12-21 16:14:57

标签: 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", 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会绘制一个圆圈,但它很薄。我d而是有一个更粗的圆圈。我想用三角形做同样的事情。任何简单的方法都可以做到这一点吗?)

也许我错误地应用了它,但遵循这个建议:

ggplot2: Making changes to symbols in the legend

添加“指南”行没有帮助:

guides(size = guide_legend(override.aes = list(shape = 1)))

即。相同的输出,图例中所有三个供应商都带有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")

现在,对于所有点,图例的大小再次降至3,包括供应商z的点。关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:4)

由于size位于aes_string之外,因此该尺寸不会应用于图例。此外,如果您创建一个指示ggplot的附加列,则vendor == "z"的工作会更容易。

以下是第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))))

请注意,vendor_zaes_string的参数。这将告诉ggplotsize特征创建图例。在函数scale_size_manual中,设置了size的值。此外,guide = FALSE仅避免了size的第二个图例。最后,size值会应用于color图例。

enter image description here

第2部分:“甜甜圈”符号

无法在ggplot中修改圆圈线条的大小。这是一个解决方法:

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

此处,使用geom_point和数据的子集(df[df$vendor_z, ])绘制单个点。我选择size 3,因为这是较小圈子的值。 shape 21是一个可以指定fill颜色的圆圈。最后,show_guide = FALSE避免了新的shape覆盖了图例特征。

enter image description here

编辑:第3部分:添加行

您可以使用参数geom_line

来取消show_guide = FALSE的图例
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))))

enter image description here