我正在尝试绘制一个正常绘制大多数数据点的绘图,但是一组数据点具有不同大小的符号。我希望图例显示相同:大多数点正常显示,但使用不同大小的符号绘制的例外。这是一小段代码:
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的点。关于如何解决这个问题的任何想法?
答案 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_z
是aes_string
的参数。这将告诉ggplot
为size
特征创建图例。在函数scale_size_manual
中,设置了size
的值。此外,guide = FALSE
仅避免了size
的第二个图例。最后,size
值会应用于color
图例。
第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
覆盖了图例特征。
编辑:第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))))