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

如何在ggplot2柱状图中隐藏NA类别且不改变百分比计算

解决方案

有两种简洁的方法可以实现你的需求——移除NA类别柱子,但百分比依然基于包含NA的全量数据计算:

方法1:在geom_bar中过滤非NA数据(保留stat="count"逻辑)

直接在geom_bar的data参数里过滤掉x为NA的行,同时保持group=1让比例计算基于全量数据集:

df_final %>%
  ggplot() +
  geom_bar(
    aes(x, y = ..prop.., group = 1),
    stat = "count",
    data = ~ dplyr::filter(., !is.na(x))  # 仅传入非NA的x数据,但比例计算仍用全量
  ) + 
  scale_y_continuous(labels = scales::percent) + 
  xlab("age.category") + 
  ylab("Percentage") + 
  theme_classic()

原理:group=1指定了比例计算的分组是整个数据集,而data参数的过滤只是控制哪些类别被绘制,不影响比例的计算逻辑。

方法2:提前计算百分比(更直观可控)

先基于全量数据算出每个类别的百分比,再过滤掉NA类别后绘图,这种方式逻辑更清晰:

library(dplyr)

df_final %>%
  mutate(total = n()) %>%  # 计算全量数据的总条数
  count(x, total) %>%      # 统计每个x类别的数量,同时保留总条数
  mutate(prop = n / total) %>%  # 计算基于全量的百分比
  filter(!is.na(x)) %>%    # 过滤掉NA类别
  ggplot(aes(x, prop)) +
  geom_col() +  # 用geom_col直接绘制预计算好的数值
  scale_y_continuous(labels = scales::percent) +
  xlab("age.category") +
  ylab("Percentage") +
  theme_classic()

这种方式避免了依赖ggplot内部的..prop..变量,后续调整或扩展更灵活。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 13:12:18