R语言绘制双类别堆叠柱状图并添加堆叠百分比标签方法
R ggplot2 百分比堆叠柱状图添加区块百分比标签实现方法
直接在现有绘图代码基础上新增geom_text()文本图层,匹配和柱状图一致的填充位置规则,同时调用ggplot2内置的统计值计算占比即可,不需要提前对数据集做汇总统计。
完整可运行示例代码
library(ggplot2) # 构造提供的示例数据集 df <- data.frame( A = c("ABC","DEF","GHI","XYZ","JKL","ABC","XYZ","XYZ"), User = c("Male","Female","Female","Female","Male","Male","Male","Female") ) ggplot(df, aes(x = User, fill = A)) + geom_bar(position = "fill") + # 新增百分比标签层 geom_text( aes(label = scales::percent(after_stat(count / tapply(count, x, sum)[x]), accuracy = 1)), position = position_fill(vjust = 0.5), size = 3.5 ) + scale_fill_brewer(palette = "BrBG") + # 同步将y轴刻度调整为百分比格式 scale_y_continuous(labels = scales::percent_format(accuracy = 1)) + labs(y = "Percent")
关键参数说明
after_stat():用于直接获取geom_bar()图层自动统计生成的变量,这里取每个堆叠块的计数count,按x轴的User分组计算组内总和后相除,得到每个A类别在对应User组的占比scales::percent():将0-1区间的小数占比自动转换为带%符号的百分比文本,accuracy = 1表示百分比取整,不需要小数位position = position_fill(vjust = 0.5):保证文本位置和堆叠柱状图的区块位置完全对齐,vjust = 0.5设置文本在区块内部垂直居中,若需要把文本放在区块上边缘可将参数改为vjust = 1- 如果需要显示原始计数而非百分比,直接将label映射改为
after_stat(count)即可,其余参数不需要调整。
若使用的是3.3.0以前的旧版本ggplot2,将代码里的
after_stat()替换为stat()即可正常运行。
内容的提问来源于stack exchange,提问作者user2845095
相关产品推荐
相关产品推荐

