You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为3张合并的ggplot图表添加与单图同排的统一图例

3张ggplot图表统一图例与单图同排的实现方案

方案1:使用cowplot包手动拼接(灵活度最高)

核心思路是先提取独立的公共图例,再将图例作为单独元素和图表一起排版:

  • 第一步:生成3张ggplot图表,统一所有图的美学映射规则(变量名、因子水平、配色映射完全一致),可以先关闭所有图的自带图例
  • 第二步:用get_legend()函数从任意一张图里提取公共图例
  • 第三步:用plot_grid()函数自定义排版,将图例和目标单图放在同一行,通过rel_widths参数调整列宽比例

代码示例:

library(ggplot2)
library(cowplot)

# 示例数据
dat <- data.frame(x = 1:10, y = rnorm(30), group = rep(c("A","B","C"), each = 10))

# 生成3张基础图,关闭自带图例
p1 <- ggplot(dat, aes(x, y, color = group)) + geom_line() + theme(legend.position = "none")
p2 <- ggplot(dat, aes(x, y, color = group)) + geom_point() + theme(legend.position = "none")
p3 <- ggplot(dat, aes(x, y, color = group)) + geom_boxplot() + theme(legend.position = "none")

# 提取公共图例
common_legend <- get_legend(
  p1 + theme(legend.position = "right")
)

# 自定义排版示例:第一行放p1,第二行放p2+图例,第三行放p3
plot_grid(
  p1,
  plot_grid(p2, common_legend, ncol = 2, rel_widths = c(4, 1)),
  p3,
  nrow = 3
)

方案2:使用patchwork包(语法更简洁)

patchwork自带公共图例收集功能,可通过guide_area()预留图例位置,直接自定义布局:

  • 第一步:生成3张ggplot图表,统一美学映射规则,无需提前关闭图例
  • 第二步:用+//拼接图表,将guide_area()和目标单图放在同一行
  • 第三步:通过plot_layout()设置guides = "collect"收集公共图例,同时调整列宽比例

代码示例:

library(ggplot2)
library(patchwork)

# 沿用上面的3张示例图,无需提前关闭图例
p1 <- ggplot(dat, aes(x, y, color = group)) + geom_line()
p2 <- ggplot(dat, aes(x, y, color = group)) + geom_point()
p3 <- ggplot(dat, aes(x, y, color = group)) + geom_boxplot()

# 自定义排版示例:第一行p1,第二行p2+图例,第三行p3
p1 / (p2 + guide_area()) / p3 +
  plot_layout(
    nrow = 3,
    widths = c(4, 1), # 第二行两列的宽度比例
    guides = "collect" # 统一收集所有图例
  )

注意事项

  • 所有图表的美学映射对应变量的属性必须完全一致,否则会出现图例拆分或不显示的问题
  • 可通过调整rel_widths(cowplot)或widths(patchwork)的数值,优化图和图例的显示比例

内容的提问来源于stack exchange,提问作者Anh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 22:39:02