无法在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区间
关键说明
- 移除重复图层:只保留
geom_col()即可实现堆叠效果,无需重复调用geom_bar()。 - 数据归一化:通过
group_by(Area, Period)分组后,将每个分类的百分比转换为组内占比,确保堆叠后每组总和为100%。 - y轴限制:使用
scale_y_continuous()强制y轴范围在0-100,同时关闭轴扩展,让图表更贴合你的需求。
内容的提问来源于stack exchange,提问作者Cami
相关产品推荐
相关产品推荐

