在R语言ggplot2分面时隐藏无观测值的空条形
解决方案
方法一:用patchwork拼接独立图表
这种方式可以分别控制每个分面的x轴显示内容,完全满足需求:
- 先加载所需包:
library(ggplot2) library(patchwork)
- 分别绘制两个分面的图表:
- 针对
villa分面,强制显示全部4种住房类型:
p_villa <- ggplot(subset(hogares, dominio == "villa"), aes(x = Tipo_vivienda, fill = niv_educ, weight = fexp)) + geom_bar(position = "fill") + labs(x = "Tipo de vivienda", title = "villa") + scale_x_discrete(limits = levels(hogares$Tipo_vivienda), guide = guide_axis(angle = 30)) + theme(plot.title = element_text(hjust = 0.5))
- 针对
no villa分面,只显示有数据的住房类型:
p_novilla <- ggplot(subset(hogares, dominio == "no villa"), aes(x = Tipo_vivienda, fill = niv_educ, weight = fexp)) + geom_bar(position = "fill") + labs(x = "Tipo de vivienda", title = "no villa") + scale_x_discrete(guide = guide_axis(angle = 30)) + theme(plot.title = element_text(hjust = 0.5))
- 拼接图表并添加总标题:
(p_villa + p_novilla) + plot_annotation(title = "Niv educ de le jefe de hogar (binario)", theme = theme(plot.title = element_text(hjust = 0.5)))
方法二:用ggh4x包实现分面独立轴控制
如果不想拆分图表,可以用ggh4x包的扩展功能,为不同分面设置不同的x轴限制:
- 加载所需包:
library(ggplot2) library(ggh4x)
- 修改原有代码:
ggplot(hogares, aes(x = Tipo_vivienda, fill = niv_educ, weight = fexp)) + geom_bar(position = "fill") + labs(x = "Tipo de vivienda", title = "Niv educ de le jefe de hogar (binario)") + scale_x_discrete(guide = guide_axis(angle = 30)) + facet_grid2(cols = vars(dominio), scales = "free_x", independent = TRUE) + scale_x_discrete(limits = function(x) { # 判断当前分面,villa分面保留全部水平,no villa只保留有数据的 if (current_facet() == "villa") { levels(hogares$Tipo_vivienda) } else { x } })
两种方法都能实现:villa分面显示全部4种住房类型,no villa分面只显示存在数据的3种类型,同时保留原数据的可比性,不需要合并列。
内容的提问来源于stack exchange,提问作者flora_
相关产品推荐
相关产品推荐

