如何使用ggplot在图表底部添加平铺式图例?
实现带底部平铺式图例的ggplot2图表
要在facet_wrap的主图下方添加平铺式图例,可以借助patchwork包将主图与自定义的图例面板垂直拼接,具体步骤如下:
1. 加载所需包
library(ggplot2) library(patchwork)
2. 调整主图(隐藏重复的X轴元素)
修改原有代码,隐藏主图的X轴文字、刻度和标题,避免与底部图例重复:
# 主图绘制 main_plot <- ggplot(data1, aes(x=specification, y=point)) + geom_errorbar(width=0.1, aes(ymin=lower, ymax=upper)) + geom_point(shape=21, size=0.5, fill="black") + ylab("Effect") + xlab("") + # 隐藏X轴相关元素 theme(axis.text.x = element_blank(), axis.ticks.x = element_blank(), axis.title.x = element_blank(), panel.background = element_blank(), strip.background = element_rect(fill = "lightgray")) + geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax), alpha = 0.1, fill = "blue", data = transform(rect, variable = c("Var 1", "Var 2")), inherit.aes = FALSE) + facet_wrap(vars(variable), ncol = 1)
3. 创建底部平铺图例面板
基于数据中的treatment_size和treatment_info属性,绘制自定义图例面板:
# 提取唯一的研究-处理对应信息 legend_data <- unique(data1[, c("specification", "treatment_size", "treatment_info")]) # 绘制图例面板 legend_plot <- ggplot(legend_data, aes(x=specification)) + # 用色块展示是否有处理 geom_tile(aes(y = "处理信息", fill = treatment_info), height = 0.8) + # 用点的大小展示处理规模 geom_point(aes(y = "处理规模", size = treatment_size), color = "black") + # 自定义颜色和点大小范围 scale_fill_manual(values = c("No" = "white", "Yes" = "gray60")) + scale_size(range = c(1, 4)) + theme_minimal() + # 调整图例面板样式 theme(axis.text.x = element_text(angle=90, vjust=0.5, hjust=1), axis.title = element_blank(), panel.grid = element_blank(), legend.position = "bottom", legend.box = "vertical", legend.title = element_text(size=8), legend.text = element_text(size=7)) + labs(fill = "是否含处理?", size = "处理规模")
4. 拼接主图与图例面板
使用patchwork的垂直拼接语法,调整两者的高度比例:
# 拼接并设置高度占比 main_plot / legend_plot + plot_layout(heights = c(4, 1))
效果说明
- 主图保留原有facet布局,专注展示效应值的误差棒和点,以及蓝色参考区间
- 底部图例面板与主图X轴的研究标签一一对应,直观展示每个研究的处理属性
- 可根据需求修改图例面板的元素(如更换geom、调整颜色/大小、添加其他属性)
内容的提问来源于stack exchange,提问作者Wilson King
相关产品推荐
相关产品推荐

