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

如何在ggplot2中实现分类变量的堆叠+分组柱状图?

分类变量分组堆叠柱状图解决方案

不需要将problem转为数值型,直接用ggplot2的位置调整参数就能实现需求——在每个problem位置展示group的两组堆叠柱状图(按grade堆叠),同时保持problem按频率降序排序。

核心思路

  • 用reorder()维持problem的频率降序排列
  • 用position_dodge()实现同一problem下两组group的并列
  • 通过group参数配合fill=grade实现每个group内的grade堆叠
  • 用after_stat()计算整体百分比(替代旧版的..count..语法)

完整代码示例

library(ggplot2)

# 构造数据集
data <- data.frame(
  group = c(rep('g1',50), rep('g2',50)), 
  grade = c(rep('1-2',20), rep('3-4',40), rep('1-2',35), rep('3-4',5)),
  problem = c(rep('p1',5), rep('p2',52), rep('p3',29), rep('p4',14))
)

# 绘制分组堆叠柱状图
ggplot(data, aes(
  x = reorder(problem, problem, function(x) -length(x)), # 按频率降序排序X轴
  fill = grade,
  group = interaction(group, grade) # 确保堆叠部分按group分组并列
)) +
  geom_bar(
    aes(y = after_stat(count)/sum(after_stat(count))), # 计算整体样本占比
    position = position_dodge(width = 0.8), # 控制并列柱子间距,避免重叠
    stat = "count"
  ) +
  labs(
    x = "问题类型",
    y = "占比",
    fill = "等级",
    title = "按问题类型和分组展示的堆叠柱状图"
  ) +
  theme_minimal()

代码说明

  1. 排序逻辑:reorder(problem, problem, function(x) -length(x))通过每个problem的样本量倒序排列X轴类别
  2. 并列与堆叠:group=interaction(group, grade)让ggplot识别每个group下的grade子组,配合position_dodge()实现同一problem下两组group的并列,同时保留grade的堆叠效果
  3. 百分比计算:若需计算每个problem内的占比而非整体占比,可将y参数改为after_stat(prop)并添加group=problem到aes()中

内容的提问来源于stack exchange,提问作者scott9

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 15:04:59