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

ggplot2中geom_bar同时使用fill与group参数失效问题求助

问题原因

  1. 你手动指定group = 1时,该参数优先级高于fill映射自带的分组规则,ggplot2会优先按全局唯一分组计算..prop..,同时覆盖了fill对应的分组逻辑,导致颜色映射失效。
  2. 你去掉group = 1后,ggplot2默认按x轴的smoke100分组计算占比,每个分组的分母就是自身的样本数,因此所有条形高度都为1,不符合你要的「每个misnervs分组下两类占比之和为1」的需求。

解决方法

推荐先对数据做预汇总再绘图,逻辑更清晰不易出错:

步骤1:用dplyr计算各分组占比

library(dplyr)
library(ggplot2)

smokement_prop <- smokement %>%
  # 按紧张频率、是否吸烟双重分组
  group_by(misnervs, smoke100) %>%
  # 统计每组样本量
  summarise(n = n(), .groups = "drop_last") %>%
  # 计算每个紧张频率分组下,是否吸烟两类的占比
  mutate(prop = n / sum(n))

步骤2:绘制目标图形

ggplot(smokement_prop, aes(x = smoke100, y = prop, fill = smoke100)) +
  # 用geom_col直接传入预计算的高度
  geom_col() +
  facet_wrap(~misnervs, nrow = 1)

如果你不想提前汇总数据,也可以直接调整geom_bar的分组参数实现需求:

ggplot(data = smokement) +
  # group指定为misnervs,即按每个facet分组计算占比
  geom_bar(aes(x = smoke100, y = after_stat(prop), fill = smoke100, group = misnervs)) +
  facet_wrap(~misnervs, nrow = 1)

注:after_stat(prop)是新版ggplot2推荐的写法,作用等价于旧版的..prop..。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:15:09