如何为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
相关产品推荐
相关产品推荐

