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

