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

在R语言中绘制基于指定数据框的百分比堆叠条形图技术问询

我来帮你排查下问题,顺便给你两种靠谱的实现方案~

你的核心问题在于:手动计算了百分比后,又在geom_bar里用了position = "fill"——这个参数本身会自动把每个x轴分组的条形高度缩放到1(对应100%),等于做了重复缩放,自然得不到预期效果。另外你想要的是0-100的百分比刻度,手动计算的percent是0-1的小数,也需要调整显示逻辑。

方案一:让ggplot自动处理百分比(最简洁)

不需要手动计算占比,直接用原始数据,借助position="fill"自动计算,再把y轴刻度转成百分比格式:

library(ggplot2)
library(dplyr)

# 假设你的原始数据集叫df
ggplot(df, aes(x = Period, fill = factor(AA))) +
  geom_bar(position = "fill") +
  # 把y轴的小数刻度转换成百分比显示
  scale_y_continuous(labels = scales::percent) +
  # 可选:设置更清晰的轴标题和图例名称
  labs(y = "占比(%)", fill = "AA类别") +
  # 解决Day1-Day99标签拥挤的问题,旋转x轴标签
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

这里把AA转成因子很重要,能让ggplot把它当作离散类别处理,避免出现奇怪的渐变填充色。

方案二:手动计算百分比(适合需要复用占比数据的场景)

如果你需要保留计算好的占比数据用于其他分析,就用这个方法,直接算出0-100的百分比,绘图时用stat="identity":

library(ggplot2)
library(dplyr)

# 先统计每个Period下AA各类别的次数,再计算百分比
df_summary <- df %>%
  count(Period, AA) %>%  # 替代aggregate的更简洁写法
  group_by(Period) %>%
  mutate(percent = n / sum(n) * 100) %>%  # 直接算出0-100的百分比
  ungroup()

# 绘图
ggplot(df_summary, aes(x = Period, y = percent, fill = factor(AA))) +
  geom_bar(stat = "identity") +
  labs(y = "占比(%)", fill = "AA类别") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:22:37