ggplot2中geom_bar同时使用fill与group参数失效问题求助
问题原因
- 你手动指定
group = 1时,该参数优先级高于fill映射自带的分组规则,ggplot2会优先按全局唯一分组计算..prop..,同时覆盖了fill对应的分组逻辑,导致颜色映射失效。 - 你去掉
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
相关产品推荐
相关产品推荐

