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

使用facet_grid绘制分组条形图时子类别异常显示问题求助

问题:分面条形图显示所有子类别在每个主类别分组中

我的数据集里每个主类别(Whereabouts)下的子类别(Thingies)数量不均,想要绘制以子类别为X轴、按主类别分组的条形图,但所有子类别都出现在了每个主类别分组中。绘制箱线图时轴显示正常,但条形图出现异常,这是我首次使用facet_grid,求排查问题。


正常的箱线图代码

SpookyReport <- HalloweenData %>% mutate(Whereabouts = fct_relevel(Whereabouts, c("Dead", "Halfdead", "Alive"))) %>% 
  ggplot(HalloweenData, mapping = aes(y = Totalspook, x = Whereabouts, fill = Thingies)) +
  geom_boxplot() +
  scale_fill_manual(values=SpookyPalette) +
  labs(y="Total spook (spook-o-meters)", x=NULL) + ggtitle("Effect of losing my mind over this") +
  theme(plot.title = element_text(hjust = 0.5)) +
  theme(legend.position="right") +
  theme(axis.line = element_line(colour = "black"),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank()) +
  theme(text = element_text(size = 15)) 
SpookyReport

(箱线图显示正常,仅展示对应主类别下的子类别)


异常的条形图代码

汇总数据代码

SpookySumReport2<-ddply(HalloweenData, .(Thingies), summarise, .progress="text", mean.cm=mean(Totalspook),
                           SD.cm=sd(Totalspook),SE.cm=sd(Totalspook)/sqrt(length(Totalspook)))
SpookySumReport2

绘图代码

SpookyReport2 <-  HalloweenData %>% mutate(Whereabouts = fct_relevel(Whereabouts, c("Dead", "Halfdead", "Alive"))) %>% 
  ggplot(LiveInocsContrasts, mapping = aes(x=Thingies, y=Totalspook, fill= Thingies)) +
  geom_bar(stat='summary') +
  geom_beeswarm(aes(x = Thingies, y = Totalspook), dodge.width = 0.9, alpha = 0.5)+
  geom_errorbar(data = SpookySumReport2, aes(x = Thingies, y = mean.cm, ymin=mean.cm-SE.cm,ymax=mean.cm+SE.cm, colour=Thingies),
                color = 'black', width = 0.2, position = position_dodge(width = 0.9)) +
  scale_fill_manual(values=SpookyPalette) +
  facet_grid(~ Whereabouts, 
             scales = "free_x",
             space = "free_x",
             switch = "x") +
  theme(panel.spacing = unit(0, units = "cm"), 
        strip.placement = "outside", 
        strip.background = element_rect(fill = "white")) + 
  theme(legend.position="none") +
  labs(y="Total spook (spook-o-meters)", x=NULL) + ggtitle("Effect of losing my mind over this") +
  theme(plot.title = element_text(hjust = 0.5)) +
  theme(axis.line = element_line(colour = "black"),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank()) +
  theme(text = element_text(size = 15)) 
SpookyReport2

(条形图异常,所有子类别都出现在每个主类别分组中)


问题排查与解决

核心问题

  1. 汇总数据未按主类别分组:当前SpookySumReport2仅按Thingies统计,没有区分Whereabouts,导致每个子类别只有一组均值和误差值,分面时会被填充到所有主类别面板中。
  2. 绘图数据源错误:绘图时传入了LiveInocsContrasts作为ggplot的数据源,但前面的数据处理是基于HalloweenData,数据源不统一可能导致匹配问题。
  3. 误差条映射未关联主类别:geom_errorbar使用的汇总数据没有Whereabouts信息,无法和分面面板对应。

修正步骤

1. 修改汇总数据代码,同时按主类别和子类别分组

SpookySumReport2 <- ddply(HalloweenData, .(Whereabouts, Thingies), summarise, .progress="text", 
                          mean.cm=mean(Totalspook, na.rm=TRUE),  # 加入na.rm避免空值报错
                          SD.cm=sd(Totalspook, na.rm=TRUE),
                          SE.cm=sd(Totalspook, na.rm=TRUE)/sqrt(length(na.omit(Totalspook))))

2. 修正绘图代码

SpookyReport2 <- HalloweenData %>% 
  mutate(Whereabouts = fct_relevel(Whereabouts, c("Dead", "Halfdead", "Alive"))) %>% 
  ggplot(mapping = aes(x=Thingies, y=Totalspook, fill=Thingies)) +  # 统一用处理后的HalloweenData
  geom_bar(stat='summary') +
  geom_beeswarm(dodge.width = 0.9, alpha = 0.5) +  # 继承全局映射,无需重复写aes
  geom_errorbar(data = SpookySumReport2, 
                aes(x=Thingies, y=mean.cm, ymin=mean.cm-SE.cm, ymax=mean.cm+SE.cm),
                color='black', width=0.2, position=position_dodge(width=0.9)) +
  scale_fill_manual(values=SpookyPalette) +
  facet_grid(~Whereabouts, scales="free_x", space="free_x", switch="x") +
  theme(panel.spacing = unit(0, "cm"), 
        strip.placement = "outside", 
        strip.background = element_rect(fill="white"),
        legend.position="none",
        plot.title = element_text(hjust=0.5),
        axis.line = element_line(colour="black"),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank(),
        text = element_text(size=15)) +
  labs(y="Total spook (spook-o-meters)", x=NULL) + 
  ggtitle("Effect of losing my mind over this")
SpookyReport2

修改后,每个分面面板只会显示对应主类别下存在的子类别,和箱线图的显示逻辑一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 13:00:55