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

如何在ggplot2中结合position_fill与position_dodge实现正负分组避让?

解决方案

要实现同一Sex下正负堆叠柱分开排列的效果,核心思路是:

  1. 按Sex和sign分组,计算每组内各年龄段的百分比(保持和原position="fill"一致的堆叠比例);
  2. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:03:02