使用ggplot2绘制共享同一Y轴的多变量分组条形图
解决方案:多变量堆叠百分比条形图合并(共享Y轴+独立图例)
核心思路
要实现任意数量变量的图形合并,关键是复用绘图逻辑+图形拼接:
- 用函数封装单个变量的绘图代码,支持快速生成任意变量的图形
- 使用
patchwork包拼接图形,实现共享Y轴,同时保留每个变量的独立图例 - 统一颜色映射,确保相同类别在不同变量中颜色一致
完整代码
1. 加载依赖包与定义颜色映射
library(ggplot2) library(patchwork) library(dplyr) # 定义所有类别统一的颜色映射(覆盖Ratio/Wealthness/Cash的所有类别) color_clrs <- c( A = "white", B = "black", C = "black", D = "white", E = "black" # 适配Cash的E类别 ) fill_clrs <- c( A = "#1f3560", B = "#bfbfbf", C = "#f2f3f3", D = "#ff0000", E = "#666666" # 给Cash的E分配颜色,可按需调整 )
2. 封装绘图函数
# 输入变量名和数据集,生成对应变量的堆叠百分比条形图 plot_single_var <- function(var_name, df) { ggplot(df, aes(Variants, fill = .data[[var_name]])) + # 绘制堆叠百分比条形图 geom_bar(position = "fill") + # 添加计数文本,隐藏文本的颜色图例 geom_text(stat = "count", aes(label = after_stat(count), color = .data[[var_name]]), position = position_fill(vjust = 0.5), show.legend = FALSE) + # 反转X轴(后续coord_flip后对应Y轴顺序) scale_x_discrete(limits = rev) + # 反转Y轴并显示百分比(可选) scale_y_continuous(trans = "reverse", labels = scales::percent) + # 设置填充色与图例名称(变量名) scale_fill_manual(values = fill_clrs, name = var_name) + # 设置文本颜色 scale_color_manual(values = color_clrs) + # 翻转坐标轴,让Variants作为Y轴 coord_flip() + # 主题调整 theme_classic() + theme( legend.position = "top", axis.ticks.x = element_blank(), axis.text.x = element_blank(), axis.title.y = element_blank(), # 去掉Y轴标题,因为共享 plot.title = element_text(hjust = 0.5, size = 12) # 子图标题居中 ) + labs(title = var_name, y = "比例") }
3. 生成并拼接图形
# 生成每个变量的图形 p_ratio <- plot_single_var("Ratio", df1) p_wealth <- plot_single_var("Wealthness", df1) p_cash <- plot_single_var("Cash", df1) # 拼接图形:3列排列,共享Y轴,保留每个变量的独立图例 p_ratio + p_wealth + p_cash + plot_layout(ncol = 3) + plot_annotation(title = "各分类变量按Variants分布", theme = theme(plot.title = element_text(hjust = 0.5, size = 14)))
扩展说明
- 支持任意数量变量:只需新增
plot_single_var("变量名", df1),然后在拼接时加入即可 - 颜色调整:直接修改
color_clrs和fill_clrs向量,新增类别时补充对应颜色即可 - 布局调整:修改
plot_layout(ncol = x)可以调整列数,比如改成ncol=1实现竖直排列
内容的提问来源于stack exchange,提问作者Bambeil
相关产品推荐
相关产品推荐

