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

如何为grid.arrange组合的4个ggplot添加底部公共图例?

解决ggplot多图组合添加公共图例的问题

你的代码无法生成公共图例的核心原因是:没有将颜色映射到ggplot的美学映射(aes())中,而是直接在geom_line()里用col参数手动指定颜色,这种情况下ggplot不会自动生成图例,自然也无法使用ggarrange(common.legend=TRUE)功能。

下面是两种可行的解决方案:

方案一:用ggpubr::ggarrange实现(推荐)

步骤1:将宽格式数据转为长格式

先把你的宽表数据(每列对应一个分组的数据集)转换为更适合ggplot的长格式:

library(ggplot2)
library(ggpubr)
library(tidyr)

# 读取数据并重构为长格式
df3 <- read.csv("mydata.csv") %>%
  pivot_longer(
    cols = starts_with("data"),  # 匹配所有以data开头的列
    names_to = c("dataset", "group"),  # 拆分列名为数据集名称和分组
    names_sep = "_"  # 按下划线拆分列名
  )

步骤2:批量生成单个图形

用函数批量绘图,统一设置颜色映射:

# 定义绘图函数
make_plot <- function(data, target_dataset) {
  ggplot(data %>% filter(dataset == target_dataset), 
         aes(x = Time, y = value, color = group)) +
    geom_line() +
    scale_color_manual(values = c("A" = "red", "B" = "blue")) +  # 指定分组颜色
    labs(title = target_dataset, y = "") +
    theme(legend.position = "none")  # 单个图隐藏图例
}

# 生成四个子图
t1 <- make_plot(df3, "data1")
t2 <- make_plot(df3, "data2")
t3 <- make_plot(df3, "data3")
t4 <- make_plot(df3, "data4")

步骤3:组合图形并添加公共图例

ggarrange(t1, t2, t3, t4,
          ncol = 2,
          common.legend = TRUE,
          legend = "bottom"  # 图例放在底部
)

方案二:用gridExtra::grid.arrange实现

如果坚持使用gridExtra,可以先提取图例再组合:

library(gridExtra)

# 先创建一个带图例的临时图
temp_plot <- ggplot(df3 %>% filter(dataset == "data1"), 
                    aes(x = Time, y = value, color = group)) +
  geom_line() +
  scale_color_manual(values = c("A" = "red", "B" = "blue")) +
  theme(legend.position = "bottom")

# 提取图例
shared_legend <- get_legend(temp_plot)

# 组合子图和图例
grid.arrange(
  arrangeGrob(t1, t2, t3, t4, ncol = 2),
  shared_legend,
  nrow = 2,
  heights = c(9, 1)  # 调整图形区和图例区的高度比例
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:34:59