You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 17:15:01