如何在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
相关产品推荐
相关产品推荐

