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

如何在R的同一图形中同时绘制并列与堆叠混合柱状图?

嘿,这个需求我太熟了!确实geom_col()默认只能选堆叠(stack)或并列(dodge),但咱们换个思路——先提前计算好每个子组的比例,就能轻松实现「并列+堆叠」的混合效果。下面是具体的实现步骤,用tidyverse工具链搞定:

第一步:预处理数据,计算比例

首先我们需要按「种族-性别」分组,统计每个健康状态在组内的占比(总和为100%)。假设你的数据集叫做df,代码如下:

library(tidyverse)

# 处理数据:计算每个种族-性别-健康状态的比例
processed_df <- df %>%
  # 先统计每个细分组合的样本量
  count(X_imprace, Sex, X_rfhlth) %>%
  # 按种族和性别分组,计算组内比例(转成百分比)
  group_by(X_imprace, Sex) %>%
  mutate(prop = n / sum(n) * 100) %>%
  ungroup()

第二步:绘制混合效果的柱状图

现在用处理好的比例数据绘图,用position = position_dodge()实现种族下男女柱子的并列,同时用fill = X_rfhlth实现柱子内部的堆叠:

ggplot(processed_df, aes(x = X_imprace, y = prop, fill = X_rfhlth)) +
  # 并列柱状图,width控制柱子宽度,dodge宽度匹配柱子宽度
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  # 可选:添加比例标签,让数值更直观
  geom_text(aes(label = paste0(round(prop, 1), "%")), 
            position = position_dodge(width = 0.8),
            vjust = -0.3, size = 3.5) +
  # 美化标签和主题
  labs(title = "不同种族、性别的健康状态比例分布",
       x = "种族",
       y = "比例(%)",
       fill = "健康状态") +
  theme_minimal()

原理说明

这个方法的核心是把「比例计算」从绘图环节提前到数据预处理环节。因为geom_col()的position="dodge"是对整个柱子的位置进行偏移,而我们已经把每个堆叠部分的高度设为组内比例,所以最终呈现的就是:每个种族下有男女两根并列柱子,每根柱子内部按健康状态堆叠,且每根柱子的总高度都是100%。

如果你的数据里有缺失值,记得先加一步drop_na(X_rfhlth, X_imprace, Sex)来清理哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:17:21