R语言大数据集堆叠百分比条形图绘制异常问题
解决R中ggplot堆叠百分比条形图的问题
我看到你遇到的问题了——你当前的代码里重复添加了geom_bar图层,这就是百分比堆叠没生效的关键原因。让我帮你修正并解释清楚:
问题分析
你先创建了p7,其中包含一个基于原始Duration值的条形图(stat="identity"),之后又叠加了另一个geom_bar(position="fill"),这相当于在原有条形图上又画了一层,结果自然无法得到每个条形总占比100%的效果。
正确解决方案
我们只需要在同一个geom_bar中设置position="fill",就能让ggplot自动将每个x组(Chimp ID)的条形高度归一化为100%,堆叠部分的高度就是对应Activity的时间占比。
方案1:直接构建百分比堆叠图(推荐)
library(ggplot2) # 核心是在geom_bar中设置position="fill" p7 <- ggplot(dat, aes(x = Who, y = Duration, fill = Activity)) + geom_bar(position = "fill", stat = "identity") + scale_fill_brewer(palette = "Set3") + xlab("Chimp ID") + ylab("Percentage of Time") + # 调整y轴标签为百分比更贴切 labs(fill = "Behaviour") + scale_y_continuous(labels = scales::percent_format()) + # 将y轴刻度转为百分比格式 theme_classic() p7
方案2:手动计算百分比后绘图(适合需要查看百分比数值的场景)
如果你需要明确看到每个类别的百分比数值,可以先通过dplyr预处理数据,再绘图:
library(ggplot2) library(dplyr) # 按Chimp ID分组,计算每个Activity的时间占比 dat_percent <- dat %>% group_by(Who) %>% mutate(Percent = Duration / sum(Duration) * 100) # 用预处理后的百分比数据绘图 p7 <- ggplot(dat_percent, aes(x = Who, y = Percent, fill = Activity)) + geom_bar(stat = "identity") + scale_fill_brewer(palette = "Set3") + xlab("Chimp ID") + ylab("Percentage of Time (%)") + labs(fill = "Behaviour") + theme_classic() p7
这两种方案都能得到你想要的每个条形总占比100%的堆叠图,方案1更简洁高效,方案2能让你直观看到计算后的百分比数值。
内容的提问来源于stack exchange,提问作者Sofia Korhonen
相关产品推荐
相关产品推荐

