如何在ggplot2中基于原始数据为堆叠条形图添加百分比标签
给堆叠条形图添加百分比标签的解决方案
我来帮你搞定这个问题~你目前的代码已经生成了按比例填充的堆叠条形图,要添加每个堆叠块的百分比标签,只需要额外加上geom_text层就行,这里有两种简单的实现方式:
方法一:直接在ggplot中通过统计变换计算百分比
这种方法不需要提前处理数据,直接利用ggplot的统计功能计算每个分组的占比:
ggplot(na.omit(cat.risk.domain), aes(COLE_CATEGORIA, fill=risklevel)) + geom_bar(position = 'fill', colour="white") + scale_y_continuous(labels = scales::percent) + # 添加百分比标签 geom_text(stat = "count", # 计算每个risklevel在对应COLE_CATEGORIA组内的百分比并格式化 aes(label = scales::percent(after_stat(count)/sum(after_stat(count)), accuracy = 1)), # 让标签在每个堆叠块的垂直居中位置 position = position_fill(vjust = 0.5), size = 3) # 可根据需求调整标签大小
这里的after_stat(count)会获取每个子分组的计数,sum(after_stat(count))则是对应COLE_CATEGORIA分组的总计数,两者相除得到占比;accuracy=1表示百分比保留整数,你可以改成0.1来保留一位小数。
方法二:先预处理数据计算百分比,再绘图
如果你需要更灵活地控制数据(比如后续还要做其他分析),可以先用dplyr提前计算好每个分组的占比:
library(dplyr) # 预处理数据:统计每个分类下各风险等级的数量和占比 cat.risk.summary <- na.omit(cat.risk.domain) %>% group_by(COLE_CATEGORIA, risklevel) %>% summarise(n = n(), .groups = "drop") %>% # 统计子组数量 group_by(COLE_CATEGORIA) %>% mutate(pct = n / sum(n)) # 计算组内百分比 # 基于预处理后的数据绘图 ggplot(cat.risk.summary, aes(COLE_CATEGORIA, y = pct, fill = risklevel)) + geom_col(colour = "white") + # 用geom_col代替geom_bar,因为已经有y值 scale_y_continuous(labels = scales::percent) + geom_text(aes(label = scales::percent(pct, accuracy = 1)), position = position_stack(vjust = 0.5), size = 3)
小提示
- 如果遇到标签重叠的情况,可以在
geom_text里加上check_overlap=TRUE,自动隐藏重叠的标签; - 调整
size参数可以改变标签的字体大小,适配你的图表尺寸。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

