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

无法在ggplot2中创建堆叠柱状图的问题排查

问题分析与解决方案

核心问题1:重复调用绘图函数

你的代码同时使用了geom_bar(position = "stack", stat = "identity")和geom_col(),而geom_col()本质就是geom_bar(stat = "identity")的简写,这会导致两个图层重叠,直接覆盖了堆叠效果,是图表未堆叠的直接原因。

核心问题2:原始数据不符合堆叠百分比要求

你的数据中,同一Area+Period分组下的Percentages总和超过100(比如inner+first分组中A=88.9、B=88.9,总和177.8),这不符合堆叠柱状图总和为100%的需求,需要先对数据做归一化处理。


修正后的完整代码

先加载必要的包并处理数据:

library(dplyr)
library(ggplot2)

# 对数据进行分组归一化,计算每个分类在组内的占比(确保堆叠后总和为100%)
DF_processed <- DF %>%
  group_by(Area, Period) %>%
  mutate(Stack_Percent = (Percentages / sum(Percentages)) * 100) %>%
  ungroup()

然后绘制堆叠柱状图:

ggplot(DF_processed) +
  aes(x = Period, y = Stack_Percent, fill = Classification) +
  geom_col(position = "stack") +  # 仅保留一个绘图函数,geom_col更简洁
  scale_fill_viridis_d(option = "viridis", direction = 1) +
  labs(y = "Frequency of occurrence (%)") +
  theme_minimal() +
  facet_wrap(vars(Area)) +
  scale_y_continuous(limits = c(0, 100), expand = c(0, 0))  # 严格限制y轴在0-100区间

关键说明

  1. 移除重复图层:只保留geom_col()即可实现堆叠效果,无需重复调用geom_bar()。
  2. 数据归一化:通过group_by(Area, Period)分组后,将每个分类的百分比转换为组内占比,确保堆叠后每组总和为100%。
  3. y轴限制:使用scale_y_continuous()强制y轴范围在0-100,同时关闭轴扩展,让图表更贴合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 00:06:05