如何在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()
代码说明
- 排序逻辑:
reorder(problem, problem, function(x) -length(x))通过每个problem的样本量倒序排列X轴类别 - 并列与堆叠:
group=interaction(group, grade)让ggplot识别每个group下的grade子组,配合position_dodge()实现同一problem下两组group的并列,同时保留grade的堆叠效果 - 百分比计算:若需计算每个
problem内的占比而非整体占比,可将y参数改为after_stat(prop)并添加group=problem到aes()中
内容的提问来源于stack exchange,提问作者scott9
相关产品推荐
相关产品推荐

