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

在R语言ggplot2分面时隐藏无观测值的空条形

解决方案

方法一:用patchwork拼接独立图表

这种方式可以分别控制每个分面的x轴显示内容,完全满足需求:

  1. 先加载所需包:
library(ggplot2)
library(patchwork)
  1. 分别绘制两个分面的图表:
  • 针对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))
  1. 拼接图表并添加总标题:
(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轴限制:

  1. 加载所需包:
library(ggplot2)
library(ggh4x)
  1. 修改原有代码:
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_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 00:06:24