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

为何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,所以没有显示柱子。

解决办法

根据你的需求选择对应的方案:

  1. 展示单个condition的数值(并列柱状图)
    如果想让每个condition的数值单独显示,把position="stack"改成position="dodge",让柱子并列排列:
ggplot(data, aes(fill=condition, y=value, x=specie)) + 
  geom_bar(position="dodge", stat="identity")
  1. 保留分组但避免堆叠总和(分面图表)
    如果需要按物种和condition分组展示单个值,改用分面柱状图更合适:
ggplot(data, aes(fill=condition, y=value, x=condition)) + 
  geom_bar(stat="identity") +
  facet_wrap(~specie)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 13:05:29