如何在ggplot2中结合position_fill与position_dodge实现正负分组避让?
解决方案
要实现同一Sex下正负堆叠柱分开排列的效果,核心思路是:
- 按
Sex和sign分组,计算每组内各年龄段的百分比(保持和原position="fill"一致的堆叠比例); - 用
sign作为分组依据,结合position_dodge实现同一Sex下正负柱的横向分隔。
步骤1:预处理数据
先计算每个Sex+sign组内,各年龄段total_effect的占比(负数值取绝对值后计算比例,保证柱子向上堆叠):
df_processed <- df %>% group_by(Sex, sign) %>% mutate( abs_effect = abs(total_effect), prop = abs_effect / sum(abs_effect) # 计算组内百分比 ) %>% ungroup()
步骤2:绘制目标图表
在ggplot中,将group映射为sign,使用position_dodge实现横向分隔,同时保持fill为Age Group的堆叠效果:
ggplot(df_processed, aes(x = Sex, y = prop, fill = `Age Group`, group = sign)) + geom_col(position = position_dodge(width = 0.8)) + # 调整width控制柱子间距 scale_fill_manual(values = colorRampPalette(brewer.pal(11, "PRGn"))(20)) + scale_y_continuous(labels = scales::percent) + # 将y轴显示为百分比 theme(legend.position = "none")
效果说明
- 每个
Sex类别下会生成两个堆叠柱,分别对应positive和negative的数值组; - 每个堆叠柱内部的颜色占比,和原
position="fill"的百分比逻辑一致; - 可以通过调整
position_dodge(width = ...)的参数值,控制正负柱子之间的间距。
内容的提问来源于stack exchange,提问作者Nautica
相关产品推荐
相关产品推荐

