使用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
(条形图异常,所有子类别都出现在每个主类别分组中)
问题排查与解决
核心问题
- 汇总数据未按主类别分组:当前
SpookySumReport2仅按Thingies统计,没有区分Whereabouts,导致每个子类别只有一组均值和误差值,分面时会被填充到所有主类别面板中。 - 绘图数据源错误:绘图时传入了
LiveInocsContrasts作为ggplot的数据源,但前面的数据处理是基于HalloweenData,数据源不统一可能导致匹配问题。 - 误差条映射未关联主类别:
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
相关产品推荐
相关产品推荐

