如何在使用 ggplot2 制作的单个图中组合填充(列)和颜色(点和线)图例?

Posted

技术标签:

【中文标题】如何在使用 ggplot2 制作的单个图中组合填充(列)和颜色(点和线)图例?【英文标题】:How to combine fill (columns) and color (points and lines) legends in a single plot made with ggplot2? 【发布时间】:2021-09-11 18:05:30 【问题描述】:

在图表中,我有列和点。我正在尝试统一传说;我已经在秤上放了相同的名字,但它们仍然是分开的。有人可以帮我解决这个问题吗?

library(ggplot2)

X <- factor(c("a", "b"))
Y1 <- c(10, 15)
Y2 <- c(22, 23)

df <- data.frame(X, Y1, Y2)

ggplot(data = df, aes(x = X,
                      group = 1)) +
  geom_col(aes(y = Y1,
               fill = "Y1")) +
  geom_line(aes(y = Y2,
                color = "Y2")) +
  geom_point(aes(y = Y2,
                 color = "Y2")) +
  scale_fill_manual(name = "Legend",
                    values = "blue") +
  scale_color_manual(name = "Legend",
                     values = "red")

【问题讨论】:

【参考方案1】:

要合并图例,您还必须在填充和色标中使用相同的值。此外,您必须通过使用guide_legendoverride.aes 参数删除“Y2”图例键的填充颜色来稍微调整图例:

编辑感谢@aosmith 的评论。为了使这种方法适用于 ggplot2 版本 limits。

library(ggplot2)

X <- factor(c("a", "b"))
Y1 <- c(10, 15)
Y2 <- c(22, 23)

df <- data.frame(X, Y1, Y2)

ggplot(data = df, aes(x = X,
                      group = 1)) +
  geom_col(aes(y = Y1,
               fill = "Y1")) +
  geom_line(aes(y = Y2,
                color = "Y2")) +
  geom_point(aes(y = Y2,
                 color = "Y2")) +
  scale_fill_manual(name = "Legend",
                    values = c(Y1 = "blue", Y2 = "red"), limits = c("Y1", "Y2")) +
  scale_color_manual(name = "Legend",
                     values = c(Y1 = "blue", Y2 = "red"), limits = c("Y1", "Y2")) +
  guides(color = guide_legend(override.aes = list(fill = c("blue", NA))))

【讨论】:

我无法重现此代码。出现以下错误信息: [[(*tmp*`, i, value = c("blue", NA)) 中的错误:replacement has 2 rows, data has 1 嗯。诡异的。我刚刚通过 reprex 包再次运行了代码。它工作正常。也许 ggplot2 版本有问题?我正在使用 ggplot2 3.3.5。 我的版本是 4.0.5。有没有办法在 4.0.5 版中做到这一点? 仅供参考,基于this issue that has been marked as a bug,我不肯定这种方法将来会一直有效,而无需在每个比例中明确设置limits @DanielValenciaC。检查您的 ggplot2 版本,即packageVersion("ggplot")。 4.0.5 是 R 版本。【参考方案2】:

另一种选择是只制作一个图例,然后手动更改该图例以使其代表所有层。

在这种情况下,我创建了一个 fill 图例,但将 color 设置为 aes() 之外的常量。我通过添加show.legend = TRUE 来强制包含线/点图层。

然后我将额外的值添加到fill,在scale_fill_manual() 中设置valueslimits。注意我将Y2 设置为透明填充。

最后,我对图例进行了手动更改,以仅在 guide_legend() 中使用 override.aes 的第二个图例键保留线条和点。

ggplot(data = df, aes(x = X,
                      group = 1)) +
    geom_col(aes(y = Y1,
                 fill = "Y1")) +
    geom_line(aes(y = Y2), color = "red", show.legend = TRUE) +
    geom_point(aes(y = Y2), color = "red", show.legend = TRUE) +
    scale_fill_manual(name = "Legend",
                      values = c(Y1 = "blue", Y2 = "transparent"),
                      limits = c("Y1", "Y2")) +
    guides(fill = guide_legend(override.aes = list(shape = c(NA, 19),
                                                   linetype = c(0, 1))))

由reprex package (v2.0.0) 于 2021 年 6 月 29 日创建

【讨论】:

以上是关于如何在使用 ggplot2 制作的单个图中组合填充(列)和颜色(点和线)图例?的主要内容,如果未能解决你的问题,请参考以下文章

如何设置 ggplot2 填充颜色以聚合统计信息?

R语言ggplot2可视化配置多个子图中的相同分组使用相同的填充色实战

ggplot2:从图中删除未使用的因子水平组合的方面(facet_grid)

在单个 3D 图中混合曲面和散点图

如何设置单个表格单元格填充?

R语言ggplot2可视化:水平半小提琴图(Horizontal Half Violin Plots)去除水平半小提琴图中的填充色ggridges包的绘制山脊图