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

使用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()

当前错误图表

当前错误图表

问题原因

  1. 多次调用geom_col()会让后续图层覆盖前面的,并非实现堆叠效果
  2. fill参数使用固定字符串(如"total"),没有映射到数据中的变量,无法生成颜色区分
  3. 直接给每个geom_col()设置不同的y值,不符合ggplot堆叠条形图的逻辑(需要长格式数据支持)

解决方案

ggplot适合处理长格式数据,先将宽格式数据转换为长格式,再用一次geom_col()实现堆叠:

  1. 转换数据格式(需要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" # 新数值列的名称
  )
  1. 绘制正确的堆叠条形图
ggplot(df_long, aes(x = region, y = count, fill = education_stage)) +
  geom_col() +
  coord_flip()

这样生成的图表会自动将primary、secondary、post16按颜色堆叠,每个条形的总高度正好对应原始数据中的total数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 06:55:10