如何用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
相关产品推荐
相关产品推荐

