双项目100%堆叠条形图百分比显示异常,请求排查代码问题
解决堆叠条形图比例与预设百分比不符的问题
嘿,我找到你代码里的问题啦!你已经预先计算好了每个类别的百分比,但当前的绘图逻辑并没有用到这些数值,反而在重新统计计数,这才导致图表比例和数据对不上。
问题根源
你用的geom_bar()是ggplot里的计数型绘图函数,它默认会统计每个value在对应variable下的出现次数,再通过position='fill'把每个条形缩放到100%。但你的数据里已经有了计算好的pct列,这个函数完全没用到它,自然会和你预期的比例不符。
修复方案
把geom_bar()换成geom_col(),并且在aes里明确指定y = pct——geom_col()是用来绘制预先计算好的数值的,这样就能直接调用你已经算好的百分比数据,完美匹配你想要的堆叠比例。
修改后的完整代码
plot_data %>% drop_na() %>% ggplot(mapping = aes(x = variable)) + # 核心修改:替换为geom_col并指定y=pct geom_col(aes(fill = value, y = pct), position = 'fill', width = 0.30)+ scale_y_continuous(name = '% of responders', breaks = seq(from = 0, to = 1, by = 0.2), minor_breaks = seq(from = 0, to = 1, by = 0.1), labels = seq(from = 0, to = 100, by = 20), expand = c(0,0)) + xlab( element_blank()) + scale_fill_manual( values = c('red', 'blue', 'green'), labels = c( 'Yes', 'No', 'Maybe' ), drop = FALSE ) + guides( fill = guide_legend(title = 'Answer') ) + theme(text = element_text(size = 12), panel.background = element_blank(), plot.margin = margin(t = 150, r = 30, b = 20, l = 0), axis.ticks.y = element_blank(), panel.grid.major = element_line(colour = 'grey'), axis.ticks.x = element_line(colour = 'grey'), panel.grid.minor = element_line(colour = 'lightgrey'), axis.text.y = element_text( size = 12, face = 'plain', hjust = 0 )) + coord_flip() + ggtitle(str_wrap("Title", width = 50)) + scale_x_discrete(labels = function(x) str_wrap(x, width = 20))
补充说明:因为你的pct列已经是每个variable下各分类的占比(加起来等于1),所以position='fill'也可以换成position='stack',视觉效果完全一致——两种方式都能让图表严格匹配你预先计算的百分比。
内容的提问来源于stack exchange,提问作者Espejito
相关产品推荐
相关产品推荐

