如何修改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()
关键修改点
- 移除
position = "fill":改用默认的position = "stack",让堆叠条的高度为各阶段年龄数量的总和,y轴显示实际数值。 - 先聚合统计数据:用
count函数提前计算每个教育阶段覆盖的年龄数量,避免ggplot自动统计比例。 - 替换
geom_bar(stat="count")为geom_col:geom_col适用于已经有统计好的y值的场景,更直观。 - 过滤NA值:旧政策中3-5岁没有对应阶段,过滤后避免图表出现无效的空类别。
内容的提问来源于stack exchange,提问作者Eva
相关产品推荐
相关产品推荐

