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

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美学的离散配色

关键说明:

  1. 加权计算:NSDUH为抽样调查,必须用ANALWT_C(对应年份的权重变量)计算人口代表性数据,避免样本偏差
  2. 分组占比逻辑:通过group_by(ALCTRY)确保每个年龄组内的地区占比总和为100%,符合“按年龄划分的地区占比”需求
  3. 图层简化:用geom_col()替代重复的geom_bar(),直接基于预计算的百分比绘制,避免ggplot内部统计逻辑冲突
  4. 配色修正:替换为scale_fill_viridis_d()匹配fill映射,正确应用配色方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 14:57:21