使用ggpubr::ggarrange合并多图后,如何显示全部顶部图例?
解决ggarrange合并子图后图例不完整的问题
方法一:统一所有子图的颜色刻度范围
ggarrange(common.legend = TRUE)默认提取第一个子图的图例,如果其他子图的图例项未在第一个图中出现,就不会被整合。解决思路是让每个子图强制包含所有需要的图例类别,这样common.legend就能提取完整的集合。
步骤及代码示例:
library(ggpubr) # 定义所有需要展示的图例类别 all_categories <- c("A", "B", "C", "D", "E") # 给每个子图添加统一的颜色刻度(如果用填充色fill,就换成scale_fill_discrete) plot_list[[1]] <- plot_list[[1]] + rremove("ylab") + rremove("xlab") + rremove("x.text") + scale_color_discrete(limits = all_categories) plot_list[[2]] <- plot_list[[2]] + rremove("ylab") + rremove("xlab") + rremove("axis.text") + scale_color_discrete(limits = all_categories) plot_list[[3]] <- plot_list[[3]] + rremove("ylab") + rremove("xlab") + scale_color_discrete(limits = all_categories) plot_list[[4]] <- plot_list[[4]] + rremove("ylab") + rremove("xlab") + rremove("y.text") + scale_color_discrete(limits = all_categories) # 组合子图,指定图例在顶部 arranged_plot <- ggarrange( plot_list[[1]], plot_list[[2]], plot_list[[3]], plot_list[[4]], labels = NULL, ncol = 2, nrow = 2, align = "hv", font.label = list(size = 10, color = "black", face = "bold", family = NULL, position = "top"), common.legend = TRUE, legend = "top" )
方法二:手动创建完整图例后添加到组合图
如果不想修改每个子图的刻度,可以先制作一个包含所有类别的虚拟图,提取它的图例,再和子图组合到一起。
代码示例:
library(ggpubr) library(ggplot2) # 定义所有需要的图例类别 all_categories <- c("A", "B", "C", "D", "E") # 创建虚拟图生成完整图例(美学映射和你的子图一致,比如color/fill) dummy_plot <- ggplot(data.frame(category = all_categories, value = 1), aes(x = category, y = value, color = category)) + geom_point() + scale_color_discrete(limits = all_categories) # 提取完整图例 full_legend <- get_legend(dummy_plot) # 先组合所有子图(记得去掉每个子图自己的图例) sub_plots <- ggarrange( plot_list[[1]] + rremove("ylab") + rremove("xlab") + rremove("x.text") + rremove("legend"), plot_list[[2]] + rremove("ylab") + rremove("xlab") + rremove("axis.text") + rremove("legend"), plot_list[[3]] + rremove("ylab") + rremove("xlab") + rremove("legend"), plot_list[[4]] + rremove("ylab") + rremove("xlab") + rremove("y.text") + rremove("legend"), labels = NULL, ncol = 2, nrow = 2, align = "hv" ) # 把子图和图例组合,调整高度比例让图例更协调 arranged_plot <- ggarrange(sub_plots, full_legend, ncol = 1, heights = c(10, 1))
注意事项
- 如果子图用的是
fill填充色而非color轮廓色,需将代码中的scale_color_discrete替换为scale_fill_discrete,美学映射部分的color也换成fill。 heights = c(10, 1)可调整子图与图例的高度占比,可根据实际显示效果微调数值。
内容的提问来源于stack exchange,提问作者akshit singh
相关产品推荐
相关产品推荐

