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

R堆叠百分比条形图出现多百分比文本问题求助

问题排查与解决:堆叠百分比条形图重复显示文本

问题根源

你遇到的重复文本问题,核心是数据维度不匹配:
原始mtcars数据集中,每个cyl(气缸数)+gear(档位)的组合对应多行记录(比如4缸+4档有8行数据)。geom_bar(position="fill")会自动将同组数值累加后绘制单个堆叠段,但geom_text会遍历每一行数据生成文本标签,导致同一个堆叠段内出现大量重复的百分比。

解决方法

需要先对数据做分组聚合,生成每个cyl+gear组合的唯一汇总行,再用聚合后的数据集绘图。

方案1:使用dplyr聚合(简洁高效)

library(ggplot2)
library(dplyr)

# 分组计算每个cyl+gear的总mpg,再计算该组在对应cyl中的占比
mtcars_agg <- mtcars %>%
  group_by(cyl, gear) %>%
  summarise(total_mpg = sum(mpg), .groups = "drop") %>%
  group_by(cyl) %>%
  mutate(percentage = total_mpg / sum(total_mpg)) %>%
  ungroup()

# 绘制堆叠百分比条形图
ggplot(mtcars_agg, aes(fill = as.factor(gear), y = percentage, x = as.factor(cyl))) +
  geom_bar(position = "fill", stat = "identity") +
  geom_text(aes(label = scales::percent(percentage)),
            position = position_fill(vjust = 0.5), size = 4, color = "black") +
  labs(title = 'MPG vs Cylinder with Gear Segmentation') +
  ylab("Percentage") +
  xlab("Cylinder") +
  scale_fill_discrete(name = "Gear")

方案2:使用Base R聚合(无需额外包)

library(ggplot2)

# 计算每个cyl+gear组合的总mpg
sum_mpg_gear <- aggregate(mpg ~ cyl + gear, mtcars, sum)
# 计算每个cyl的总mpg
sum_mpg_cyl <- aggregate(mpg ~ cyl, sum_mpg_gear, sum)
# 合并数据并计算百分比
sum_mpg_gear <- merge(sum_mpg_gear, sum_mpg_cyl, by = "cyl", suffixes = c("_gear", "_cyl"))
sum_mpg_gear$percentage <- sum_mpg_gear$mpg_gear / sum_mpg_gear$mpg_cyl

# 绘图
ggplot(sum_mpg_gear, aes(fill = as.factor(gear), y = percentage, x = as.factor(cyl))) +
  geom_bar(position = "fill", stat = "identity") +
  geom_text(aes(label = scales::percent(percentage)),
            position = position_fill(vjust = 0.5), size = 4, color = "black") +
  labs(title = 'MPG vs Cylinder with Gear Segmentation') +
  ylab("Percentage") +
  xlab("Cylinder") +
  scale_fill_discrete(name = "Gear")

关键说明

两种方案的核心都是先将数据聚合到cyl+gear的唯一组合维度,确保每个堆叠段对应唯一一行数据,这样geom_text就只会在每个分段中生成一次百分比标签。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 12:30:06