ggplot如何绘制同时支持堆叠和分组效果的柱状图
实现思路
1. 数据规整
首先你需要把两套独立的数据集合并为统一的长表结构:
- 假设你现有两个数据集,分别对应施害者、受害者的统计数据,两个数据集均包含统一水平的
年龄组因子、遇害状态因子(取值为遇害/未遇害) - 给施害者数据集新增
人群类型字段,赋值为施害者;给受害者数据集新增同名字段,赋值为受害者 - 用
dplyr::bind_rows()或者基础函数rbind()拼接两个数据集,得到总表combined_df
注意:需要提前统一
年龄组、遇害状态的因子水平顺序,避免合并后出现分组错乱、堆叠顺序不一致的问题
2. 核心绘图代码(基于ggplot2)
library(ggplot2) library(dplyr) ggplot(combined_df, aes(x = 年龄组, y = 计数, fill = 遇害状态, group = 人群类型)) + # 绘制带闪避的堆叠柱 geom_col(position = position_dodge2(width = 0.9, preserve = "single"), alpha = 0.85) + # 可选:添加柱子边框区分两个人群,辨识度更高 geom_col(aes(color = 人群类型), position = position_dodge2(width = 0.9, preserve = "single"), fill = NA, size = 1.2) + # 自定义颜色,可根据需求调整 scale_fill_manual(values = c("遇害" = "#e63946", "未遇害" = "#457b9d")) + scale_color_manual(values = c("施害者" = "#1d3557", "受害者" = "#e63946")) + labs(x = "年龄组", y = "样本数量", fill = "状态", color = "人群分类") + theme_bw()
如果你的数据是未做汇总的原始行数据,不需要提前统计计数,直接把geom_col替换为geom_bar(stat = "count"),去掉y轴的计数映射即可。
3. 关键参数说明
position_dodge2(width = 0.9):控制同一个年龄组下的两根柱子的闪避间距,避免重叠preserve = "single":保证所有柱子宽度一致,不会因为某个分组下缺少某类人群数据就拉伸剩余柱子的宽度group = 人群类型:指定闪避分组的依据,确保同一人群的堆叠柱作为一个整体闪避
内容的提问来源于stack exchange,提问作者BCBugajski
相关产品推荐
相关产品推荐

