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
相关产品推荐
相关产品推荐

