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

如何修改ggplot2堆叠条形图以显示实际年龄而非比例?

解决ggplot2堆叠条形图显示实际年龄数量而非比例的问题

问题分析

你当前代码里的position = "fill"会让堆叠条形图按比例填充,所以y轴显示0-1的比例值;而stat = "count"只是统计每组的行数,但结合fill位置参数后就变成了比例。要显示实际年龄相关的数值(比如每个教育阶段覆盖的年数),需要调整数据处理和绘图逻辑。

修改后的完整代码

library(tidyverse)

# 原始数据集
NEP <- tibble::tribble(
                 ~Age, ~Level_in_Old_Education_Policy, ~Level_in_NEP_2020,
                   3L,                             NA,     "Foundational",
                   4L,                             NA,     "Foundational",
                   5L,                             NA,     "Foundational",
                   6L,                      "Primary",     "Foundational",
                   7L,                      "Primary",     "Foundational",
                   8L,                      "Primary",      "Preparatory",
                   9L,                      "Primary",      "Preparatory",
                  10L,                      "Primary",      "Preparatory",
                  11L,                      "Primary",           "Middle",
                  12L,                      "Primary",           "Middle",
                  13L,                      "Primary",           "Middle",
                  14L,                    "Secondary",        "Secondary",
                  15L,                    "Secondary",        "Secondary",
                  16L,                    "Secondary",        "Secondary",
                  17L,             "Higher Secondary",        "Secondary",
                  18L,             "Higher Secondary",        "Secondary"
                 )

# 数据转换与统计:计算每个政策-阶段组合覆盖的年龄数量
NEP_Summary <- NEP %>%
  # 重命名列并转长格式
  select(Age, Old = Level_in_Old_Education_Policy, New = Level_in_NEP_2020) %>%
  pivot_longer(cols = 2:3, names_to = "Education_Policy", values_to = "Values") %>%
  # 过滤旧政策中无对应阶段的年龄(NA值)
  filter(!is.na(Values)) %>%
  # 统计每组的年龄数量(即该阶段覆盖的年数)
  count(Education_Policy, Values, name = "Age_Count")

# 绘制堆叠条形图
ggplot(NEP_Summary, aes(x = Education_Policy, y = Age_Count, fill = Values)) +
  geom_col() + # 用geom_col直接使用已统计的y值,替代stat="count"
  # 自定义标签让图表更清晰
  labs(
    y = "覆盖年龄数量",
    x = "教育政策",
    fill = "教育阶段",
    title = "新旧教育政策各阶段覆盖年龄对比"
  ) +
  theme_minimal()

关键修改点

  1. 移除position = "fill":改用默认的position = "stack",让堆叠条的高度为各阶段年龄数量的总和,y轴显示实际数值。
  2. 先聚合统计数据:用count函数提前计算每个教育阶段覆盖的年龄数量,避免ggplot自动统计比例。
  3. 替换geom_bar(stat="count")为geom_col:geom_col适用于已经有统计好的y值的场景,更直观。
  4. 过滤NA值:旧政策中3-5岁没有对应阶段,过滤后避免图表出现无效的空类别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 14:25:18