R语言ggplot2堆叠百分比柱状图添加准确标签方案咨询
方案1:无需提前数据预处理,直接修改geom_text代码即可
你之前的标签计算逻辑问题出在:..count../sum(..count..)统计的是全数据集的百分比,而非每个成绩分组内的性别占比,同时没有指定分组维度导致计算逻辑匹配不上堆叠柱图的分组规则。
直接替换注释掉的geom_text代码段为以下内容即可正常显示百分比:
geom_text(aes(label = scales::percent(after_stat(prop), accuracy = 1), group = GRDE_CODE), stat = "count", position = position_fill(vjust = 0.5))
如果需要同时展示计数和百分比,修改label参数即可:
geom_text(aes(label = paste0(after_stat(count), "\n", scales::percent(after_stat(prop), accuracy = 1)), group = GRDE_CODE), stat = "count", position = position_fill(vjust = 0.5))
方案2:轻量预处理(更推荐,完全避免标签错位)
仅需少量汇总代码即可实现100%匹配的标签效果,逻辑清晰不易出错:
第一步:数据预处理
library(dplyr) plot_data <- df.test %>% # 保留原过滤逻辑 filter(!(GRDE_CODE %in% c("IP", "INC", "NG"))) %>% filter(Course.lvl %in% c("200-level", "100-level")) %>% # 按分面、X轴、填充维度分组计数 count(Course.lvl, GRDE_CODE, GENDER, name = "cnt") %>% # 计算每个分组内的性别占比 group_by(Course.lvl, GRDE_CODE) %>% mutate(pct = cnt / sum(cnt)) %>% ungroup()
第二步:绘图代码
ggplot(plot_data, aes(x = GRDE_CODE, fill = GENDER)) + # 改用geom_col直接传入汇总好的数值 geom_col(aes(y = pct), position = "fill") + # 直接使用预处理好的计数和百分比 geom_text(aes(y = pct, label = paste0(cnt, "\n", scales::percent(pct, accuracy = 1))), position = position_fill(vjust = 0.5)) + scale_y_continuous(labels = scales::percent) + scale_fill_manual(values = c(Female = "#F99A46", Male = "#0BB021", `Not Reported` = "#3404DD")) + labs(x = "Grade Code", y = "% of Grade", title = "Math - 100/200") + coord_flip() + theme_classic() + facet_grid(vars(), vars(Course.lvl))
内容的提问来源于stack exchange,提问作者Benjamin Diaz
相关产品推荐
相关产品推荐

