ggplot2在facet_grid内绘制百分比柱状图时填充异常问题
解决facet_grid分面内百分比填充异常的问题
嘿,我刚好碰到过类似的问题!你说的填充异常确实是group参数设置不对导致的——现在你把group指定为cyl,但每个分面是cyl和gear的组合,这就导致比例计算的分组和填充的分组逻辑不匹配,所以显示出问题了。
下面给你两种可行的解决方案:
方法1:调整ggplot内的group参数
我们需要让group参数匹配每个分面的组合(也就是cyl+gear的交互项),这样..prop..会在每个分面内正确计算vs的比例,同时fill和x轴的vs保持一致,不会冲突:
library(ggplot2) library(dplyr) library(scales) mtcars %>% ggplot(aes(as.factor(vs))) + geom_bar( aes(fill = as.factor(vs), y = ..prop.., group = interaction(as.factor(cyl), as.factor(gear))), show.legend = FALSE ) + scale_y_continuous(labels = percent) + facet_grid(as.factor(cyl) ~ as.factor(gear), scales = "free")
这里interaction(as.factor(cyl), as.factor(gear))会把每个cyl和gear的组合作为独立分组,确保百分比在每个分面内单独计算,填充也会正常对应vs的类别。
方法2:先预处理数据(更直观易维护)
如果你觉得依赖ggplot的内部变量..prop..不够清晰,可以先用dplyr提前计算好每个分面内的百分比,再绘图,这种方式逻辑更明确,也不会出现分组冲突:
library(ggplot2) library(dplyr) library(scales) mtcars %>% # 先把变量转成因子,方便后续分组 mutate( vs = as.factor(vs), cyl = as.factor(cyl), gear = as.factor(gear) ) %>% # 按分面变量+vs分组计数 group_by(cyl, gear, vs) %>% summarise(count = n(), .groups = "drop_last") %>% # 计算每个分面内的百分比 mutate(percent = count / sum(count)) %>% ggplot(aes(x = vs, y = percent, fill = vs)) + geom_col(show.legend = FALSE) + scale_y_continuous(labels = percent) + facet_grid(cyl ~ gear, scales = "free")
这种方式先明确计算出每个分面内vs类别的占比,再用geom_col绘制柱状图,完全避免了group和fill的冲突问题,也更容易调试和修改。
内容的提问来源于stack exchange,提问作者al_the_man
相关产品推荐
相关产品推荐

