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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:16:43