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

如何在ggplot中绘制堆叠柱状图(无需重塑数据框)

嘿,我来帮你搞定这个堆叠柱状图的问题!

你的代码之所以只显示mythirdC的柱子,主要有两个原因:

  • 两次调用geom_col都是从y轴0的位置开始绘制,而mythirdC的数值普遍比mysecondC大,直接把底层的柱子完全覆盖了;
  • 你用了colour参数设置的是柱子边框颜色,而非填充色,就算没有覆盖,也很难看出两层的区别。

不用重塑数据框的话,我们可以通过给第二个图层设置堆叠位置来解决,下面是两种可行的写法:

方法1:用geom_bar实现堆叠

geom_col本质是geom_bar(stat="identity")的简写,我们直接用geom_bar并指定position="stack",让上层柱子堆叠在底层上面:

library(ggplot2)
mydf=data.frame(c("A","B","C","D"),c(100,110,90,120),c(150,200,160,180))
names(mydf)=c("myfirstC","mysecondC","mythirdC")

ggplot(data=mydf, aes(x=myfirstC))+ 
  # 绘制底层的mysecondC柱子,绑定填充色映射
  geom_bar(aes(y=mysecondC, fill="mysecondC"), stat="identity")+ 
  # 绘制上层的mythirdC柱子,开启堆叠模式
  geom_bar(aes(y=mythirdC, fill="mythirdC"), stat="identity", position="stack") +
  # 手动指定填充色对应关系
  scale_fill_manual(values=c("mysecondC"="blue", "mythirdC"="red")) +
  # 优化图表标签
  labs(
    title = "Stacked Bar Chart",
    x = "Category",
    y = "Value",
    fill = "Data Column"
  )

方法2:用geom_col实现堆叠

如果你更习惯用geom_col,只需要给第二个geom_col加上position="stack"参数即可,效果完全一致:

ggplot(data=mydf, aes(x=myfirstC))+ 
  geom_col(aes(y=mysecondC, fill="mysecondC"))+ 
  geom_col(aes(y=mythirdC, fill="mythirdC"), position="stack") +
  scale_fill_manual(values=c("mysecondC"="blue", "mythirdC"="red")) +
  labs(
    title = "Stacked Bar Chart with geom_col",
    x = "Category",
    y = "Value",
    fill = "Data Column"
  )

这样就能得到清晰的堆叠柱状图,两层柱子分别对应mysecondC和mythirdC,颜色区分明显,而且完全不需要修改原数据框的结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:57:25