为何geom_bar未正确绘制数据框中的y值?
问题:ggplot堆叠柱状图y轴数值与数据框值不匹配
你运行以下代码生成数据框后,绘制堆叠柱状图时发现y轴显示的数值和数据框里的单个值对不上:
set.seed(1) specie <- c(rep("sorgho" , 3) , rep("poacee" , 3) , rep("banana" , 3) , rep("triticum" , 3), rep('berrie', 3) ) condition <- rep(c("normal" , "stress" , "Nitrogen") , 5) value <- append( abs(rnorm(12 , 0 , 15)), rep(NA,3)) data <- data.frame(specie,condition,value)
生成的数据框如下:
specie condition value 1 sorgho normal 9.396807 2 sorgho stress 2.754650 3 sorgho Nitrogen 12.534429 4 poacee normal 23.929212 5 poacee stress 4.942617 6 poacee Nitrogen 12.307026 7 banana normal 7.311436 8 banana stress 11.074871 9 banana Nitrogen 8.636720 10 triticum normal 4.580826 11 triticum stress 22.676718 12 triticum Nitrogen 5.847649 13 berrie normal NA 14 berrie stress NA 15 berrie Nitrogen NA
绘图代码:
ggplot(data, aes(fill=condition, y=value, x=specie)) + geom_bar(position="stack", stat="identity")
生成的图表:
原因解释
你用的是position="stack"的堆叠柱状图,这种图表的y轴显示的是每个物种下所有condition对应的value的总和,而不是单个condition的数值。比如sorgho的三个value相加(9.4+2.8+12.5≈24.7),刚好对应图表中sorgho柱子的总高度,所以y轴的刻度是总和的范围,和单个值自然不匹配。另外berrie的value全是NA,所以没有显示柱子。
解决办法
根据你的需求选择对应的方案:
- 展示单个condition的数值(并列柱状图)
如果想让每个condition的数值单独显示,把position="stack"改成position="dodge",让柱子并列排列:
ggplot(data, aes(fill=condition, y=value, x=specie)) + geom_bar(position="dodge", stat="identity")
- 保留分组但避免堆叠总和(分面图表)
如果需要按物种和condition分组展示单个值,改用分面柱状图更合适:
ggplot(data, aes(fill=condition, y=value, x=condition)) + geom_bar(stat="identity") + facet_wrap(~specie)
内容的提问来源于stack exchange,提问作者Noah_Seagull
相关产品推荐
相关产品推荐

