添加考虑颜色、形状和线型的组合图例,同时保留原始图例

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() 函数中调用它。

以上是关于添加考虑颜色、形状和线型的组合图例,同时保留原始图例的主要内容,如果未能解决你的问题,请参考以下文章

matlab中画图线型怎么设置

ggplot 有两个图例,颜色图例中显示错误的形状

ggplot散点图中的传说问题

为线条/形状组合正确显示 ggplot 图例

R语言ggplot2可视化抑制(部分)图例(legend)输出实战:抑制颜色图例输出保留数据点形状图例输出

在 ggplot 中结合颜色和线型图例