使用ggplot创建堆叠条形图遇问题:无法实现多堆叠分层显示
ggplot堆叠条形图分层显示问题解决
问题描述
想要用ggplot创建堆叠条形图,每个条形展示primary、secondary、post16三个类别的构成(不同颜色区分),条形总高度对应total数值,但当前生成的图表没有颜色分层,问题出在geom_col()的使用方式上。
原始数据
df <- read_table("region total primary secondary post16 East 21 4 8 9 Mid 28 3 15 10 North 7 2 4 1 South 13 3 5 5")
错误代码
ggplot(df, aes(x = as.factor(region), y = total, fill = "total")) + geom_col() + geom_col(aes(y = primary, fill = "prim")) + geom_col(aes(y = secondary, fill = "seco")) + geom_col(aes(y = post16, fill = "p16")) + coord_flip()
当前错误图表

问题原因
- 多次调用
geom_col()会让后续图层覆盖前面的,并非实现堆叠效果 fill参数使用固定字符串(如"total"),没有映射到数据中的变量,无法生成颜色区分- 直接给每个
geom_col()设置不同的y值,不符合ggplot堆叠条形图的逻辑(需要长格式数据支持)
解决方案
ggplot适合处理长格式数据,先将宽格式数据转换为长格式,再用一次geom_col()实现堆叠:
- 转换数据格式(需要
tidyr包,未安装先执行install.packages("tidyr"))
library(tidyr) library(dplyr) df_long <- df %>% select(-total) %>% # 移除total列,三个类别数值的和就是total,堆叠后自动对应总高度 pivot_longer( cols = c(primary, secondary, post16), # 需要转换的列 names_to = "education_stage", # 新类别列的名称 values_to = "count" # 新数值列的名称 )
- 绘制正确的堆叠条形图
ggplot(df_long, aes(x = region, y = count, fill = education_stage)) + geom_col() + coord_flip()
这样生成的图表会自动将primary、secondary、post16按颜色堆叠,每个条形的总高度正好对应原始数据中的total数值。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

