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

ggplot2 facet grid柱状图修改X轴后堆叠,无法取消堆叠

ggplot2柱状图堆叠问题处理

问题描述

原本使用以下代码可正常绘制分面柱状图:

ggplot(Halle1, aes(x=regime, y=CO_real, fill = hight)) + geom_bar(stat="identity")+ facet_grid(~ Gang, scales = "free_x", space= "free_x", labeller=labeller(Gang = Halle1_labels) )

将X轴替换为location列后,柱子出现堆叠现象,即使添加position="dodge"也无法得到预期效果:

ggplot(Halle1, aes(x=location, y=CO_real, fill = hight)) + geom_bar(stat="identity")+ facet_grid(~ Gang, scales = "free_x", space= "free_x", labeller=labeller(Gang = Halle1_labels) )

数据示例:

Halle1 <- data.frame( regime = structure(c(2L, 2L, 4L, 5L, 1L, 6L, 8L, 3L), levels = c("H1M7ho", "H1M7hu", "H1M3ho", "H1M3hu", "H1M4vo", "H1M4vu", "H1M1ho", "H1M1hu", "H1M2vo", "H1M2vu"), class = "factor"), CO_real = c(27, 34, 29, 23, 25, 28, 31, 30), Gang = c(41, 41, 44, 44, 41, 44, 52, 44), location = c("hinten", "hinten", "hinten", "vorne", "hinten", "vorne", "hinten", "hinten"), hight = c("unten", "unten", "unten", "oben", "oben", "unten", "unten", "oben") )

问题原因

核心问题是同一location+Gang+hight组合下存在多条重复数据:比如示例数据中,Gang=41、location=hinten、hight=unten对应2条记录。ggplot2的geom_bar(stat="identity")默认会将同一分组内的数值累加导致堆叠;而position="dodge"需要明确的分组维度拆分柱子,当前仅用location和hight无法区分重复行,因此无效。

解决方案

根据需求选择以下两种方案:

方案1:先聚合数据(推荐,适合展示统计量)

如果需要展示同一分组的总和、均值等统计量,先通过分组聚合处理数据,再绘图:

# 加载dplyr包用于数据聚合
library(dplyr)
# 按location、Gang、hight分组,计算CO_real的总和(可替换为mean求均值)
Halle1_agg <- Halle1 %>%
  group_by(location, Gang, hight) %>%
  summarise(CO_real = sum(CO_real), .groups = "drop")

# 用聚合后的数据绘图,position="dodge"实现并列柱子
ggplot(Halle1_agg, aes(x=location, y=CO_real, fill = hight)) +
  geom_bar(stat="identity", position=position_dodge(width=0.9)) +
  facet_grid(~ Gang, scales = "free_x", space= "free_x", labeller=labeller(Gang = Halle1_labels))

方案2:保留原始数据,新增区分维度

如果需要保留每条原始数据的独立柱子,需给重复分组添加唯一标识(如行号)作为分组依据:

# 添加唯一行号列
Halle1$row_id <- seq(nrow(Halle1))

# 绘图时指定group=row_id,让ggplot区分每条记录
ggplot(Halle1, aes(x=location, y=CO_real, fill = hight, group=row_id)) +
  geom_bar(stat="identity", position=position_dodge(width=0.9)) +
  facet_grid(~ Gang, scales = "free_x", space= "free_x", labeller=labeller(Gang = Halle1_labels))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:24:28