如何移除ggplot2分面柱状图中单个分面的空白柱空间?
解决ggplot2分面柱状图空白柱问题
核心原因
你遇到的空白柱是因为facet_wrap默认所有分面共享统一的x轴类别(所有talent值),哪怕某个分面里没有对应类别的数据,x轴还是会预留位置,导致空白柱。
具体解决方法
方法1:让分面x轴自适应有数据的类别
直接修改facet_wrap的参数,开启x轴自由缩放,这样每个分面只会显示当前有数据的talent类别,自动移除空白位置:
修改代码中的facet_wrap(~level)为:
facet_wrap(~level, scales = "free_x")
同时可以调整geom_jitter的position_dodge参数(x轴自由后每个位置只有一组数据,可适当缩小width值让点和柱子对齐):
geom_jitter(data=ds, mapping=aes(x=talent,y=mnAud,colour=talent), position = position_dodge(width = 0.3), alpha=0.5, show.legend=FALSE)
方法2:提前按分面过滤无效数据
如果单纯开自由x轴还不够,可以先过滤掉每个level下无数据的talent行,确保每个分面的数据都是有效的:
先加载dplyr处理数据:
library(dplyr) # 过滤每个level+talent组合下无有效数据的行(可根据实际数据调整过滤条件) ds_filtered <- ds %>% group_by(level, talent) %>% filter(!is.na(mnAud) & mnAud > 0) ungroup()
然后在ggplot中使用过滤后的数据集ds_filtered,配合scales="free_x":
ggplot(mapping = aes(x = talent,y = mnAud,fill = talent)) + theme_bw() + geom_jitter(data=ds_filtered,mapping=aes(x=talent,y=mnAud,colour=talent), position = position_dodge(width = 0.3), alpha=0.5,show.legend=FALSE) + scale_y_continuous(breaks=c(0, 5, 10)) + geom_col(show.legend=FALSE,colour="black",alpha=0.5, stat="identity") + geom_errorbar(mapping = aes(ymin = mnAud-sderrAud, ymax = mnAud+sderrAud), width=0.2) + facet_wrap(~level, scales = "free_x") + scale_fill_brewer(palette="Set1") + scale_colour_brewer(palette="Set1") + labs(title = "Audience rating for each kind of talent", y = "Rating (higher=better)", x = "Talent")
为什么之前的方法没用?
position = dodge只是调整柱子和点的位置,不会移除x轴上的空白类别;- 单纯过滤数据如果没按
level和talent组合过滤,全局的x轴还是会包含所有talent值,空白位置依然存在。
内容的提问来源于stack exchange,提问作者user24318864
相关产品推荐
相关产品推荐

