ggplot百分比柱状图问题排查:按地区划分首次饮酒年龄占比
问题排查与修正方案
核心错误点:
- 重复调用
geom_bar(),导致原始计数与百分比图层叠加,显示逻辑混乱 - 百分比计算用全局总和
sum(..count..),未按**年龄组(ALCTRY)+地区(COUTYP4)**分组计算占比,无法实现同年龄组内各地区占比为100%的需求 position="dodge"仅作用于第一个柱状图层,百分比图层未设置分组错开,无法正确展示分组对比- 使用
scale_color_viridis()但映射的是fill美学,配色未生效 - 未使用NSDUH数据的抽样权重(如
ANALWT_C)做人口调整,结果不具备真实人口代表性 - Y轴标签与图表意图不符(实际展示百分比,却标注“Number Initiated”)
修正后的代码:
palc.age.ct <- data1.cleaned %>% mutate(ALCTRY = na_if(ALCTRY, "Never Used")) %>% drop_na(ALCTRY) %>% # 按年龄+地区分组,计算加权样本量(匹配真实人口分布) group_by(ALCTRY, COUTYP4) %>% summarise(weighted_count = sum(ANALWT_C)) %>% ungroup() %>% # 按年龄组计算各地区的占比(同年龄组内占比总和为100%) group_by(ALCTRY) %>% mutate(pct = weighted_count / sum(weighted_count)) %>% ungroup() %>% ggplot(aes(x = ALCTRY, y = pct, fill = COUTYP4)) + geom_col(position = "dodge") + # 直接绘制预计算的百分比数值 scale_y_continuous(labels = scales::percent) + theme_minimal() + labs(title = "First Alcohol Use by Age and Locality", x = "Age Initiated", y = "Percentage of Initiates by Locality") + scale_fill_viridis_d(option = "D") # 匹配fill美学的离散配色
关键说明:
- 加权计算:NSDUH为抽样调查,必须用
ANALWT_C(对应年份的权重变量)计算人口代表性数据,避免样本偏差 - 分组占比逻辑:通过
group_by(ALCTRY)确保每个年龄组内的地区占比总和为100%,符合“按年龄划分的地区占比”需求 - 图层简化:用
geom_col()替代重复的geom_bar(),直接基于预计算的百分比绘制,避免ggplot内部统计逻辑冲突 - 配色修正:替换为
scale_fill_viridis_d()匹配fill映射,正确应用配色方案
内容的提问来源于stack exchange,提问作者Kimberly Boland
相关产品推荐
相关产品推荐

