添加考虑颜色、形状和线型的组合图例,同时保留原始图例
Posted
技术标签:
【中文标题】添加考虑颜色、形状和线型的组合图例,同时保留原始图例【英文标题】:Add a combined legend that accounts for color, shape, and linetype, while keeping the original legends 【发布时间】:2020-10-27 22:44:09 【问题描述】:我有以下df:
df <- data.frame("id" = c("A1", "A1", "A1", "A2", "A2", "A2", "B1", "B1", "B1", "B2", "B2", "B2"),
"group" = c("A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B"),
"version" = c("1", "1", "1", "2", "2", "2", "1", "1", "1", "2", "2", "2"),
"var_1" = 1:3,
"var_2" = 1:12)
我使用以下代码::
library(ggplot2)
ggplot(data = df, aes(x = var_1, y = var_2, by = "id")) +
stat_summary(fun = "mean", geom = "line", aes(color = factor(id), linetype = (version))) +
stat_summary(fun = "mean", geom = "point", aes(color = factor(id), shape = (group))) +
labs(color = "id", linetype = "version", shape = "group")
并得到以下情节:
问题在于,在“id”图例中,形状和线型是通用的,并不总是与正确的形状/线型匹配。
我想做的是让“id”的图例显示正确的形状和线型,同时保留“组”和“版本”的单独的原始图例。
这意味着我的目标是让“组”和“版本”图例保持不变,但“id”图例中的条目根据需要修改其形状和线型。
【问题讨论】:
【参考方案1】:您可以通过guide_legend
执行此操作。在其中,您可以覆盖通过其他 ggplot2
命令指定的默认 aes()
以匹配您想要的:
p + guides(color=guide_legend(
override.aes = list(linetype=c(1,3,1,3), shape=c(16,16,17,17))))
【讨论】:
这可行,但有没有办法在不手动指定线型/形状的情况下做到这一点? 不完全据我所知。 ggplot 基本上为每个aes()
维护一个单独的图例。所以这意味着当你有一个结合了形状和线型的图例时......你实际上看到了这两个图例的叠加。这也意味着如果您希望您的颜色图例包括形状和线型(如这里),您基本上必须复制这些图例(不确定是否有办法做到这一点),或者将它们分开并覆盖图例的 aes你想要的东西组合在一起(这就是我在这里所做的)。
如果您想以编程方式定义图例中的覆盖 aes,您应该能够在另一个数据框中的 ggplot
调用之前定义它,并在 guide_legend()
函数中调用它。
以上是关于添加考虑颜色、形状和线型的组合图例,同时保留原始图例的主要内容,如果未能解决你的问题,请参考以下文章