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

如何用R语言ggplot2绘制指定样式的堆叠条形图?

解决ggplot2堆叠条形图不符合预期的问题

你的代码问题在于两次调用geom_bar()时,默认使用stat="count"逻辑,会自动统计每个类别的出现次数,导致堆叠逻辑混乱,且无法实现每层高度为1的需求。要达成目标,需先调整数据结构,再使用geom_col()直接指定高度绘制。

完整解决方案代码

library(ggplot2)
library(tidyr)

# 原始数据
x <- 1:5
y1 <- c("m", "m", "m" ,"m", "n")
y2 <- c("m", "m", "n" ,"n", "p")
colors <- c("m" = "red", "n" = "green", "p" = "blue")

# 将宽格式数据转换为长格式,区分层级与类别
df <- data.frame(x = x, y1 = y1, y2 = y2) %>%
  pivot_longer(cols = starts_with("y"), names_to = "layer", values_to = "category")

# 绘制目标堆叠条形图
ggplot(df, aes(x = x, y = 1, fill = category)) +
  geom_col(position = "stack", color = "black") +
  scale_fill_manual(values = colors) +
  labs(y = "高度") # 可选:自定义y轴标签

关键说明

  • 数据格式转换:pivot_longer()将原宽格式的y1、y2列转换为长格式,新增layer列标识层级(y1或y2),category列存储对应类别(m/n/p),确保每个x值对应两行数据(每层一行)。
  • 指定高度绘制:geom_col()直接使用y=1设定每层高度为1,position="stack"(默认行为,可省略)自动将同一x的两层堆叠,总高度为2。
  • 颜色映射:scale_fill_manual()严格匹配你定义的颜色规则,实现第一层red-red-red-red-green、第二层red-red-green-green-blue的堆叠效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:55:42