R ggplot2堆叠计数条形图仅为指定填充类加柱顶百分比标签的方法
自定义堆叠条形顶端标签实现方案
核心实现逻辑
不需要对所有堆叠段统一添加标签,只需要单独提取rework_status == "No Rework"的数据子集,将文本绘制位置对齐到每个条形的最顶端即可,全程不影响原有分段居中计数标注的展示效果。
调整后的可运行代码
library(ggplot2) library(dplyr) # 用于数据筛选,未安装可先运行 install.packages("dplyr") ggplot(CRM_df_2, aes(q_year, count, fill = rework_status)) + geom_bar(stat = "identity", color = "black", width = 1) + # 保留原有堆叠分段居中的计数标注 geom_text(aes(label = count), position = position_stack(0.5), size = 6, color = "black") + # 新增仅针对No Rework类别的顶端占比标签 geom_text( data = CRM_df_2 %>% filter(rework_status == "No Rework" & count > 0), aes(label = paste0(percent, "%")), position = position_stack(vjust = 1.1), # 上移少量距离避免标签和条形边框重叠 size = 5, color = "black" ) + facet_wrap(. ~ quarter, scales = 'free_x', nrow = 1, strip.position = 'bottom') + theme( strip.text = element_blank(), strip.placement = 'outside', legend.position = "bottom", legend.title = element_blank(), axis.title.x = element_blank(), axis.title.y = element_blank(), plot.title = element_text(hjust = 0.5), legend.spacing.x = unit(1.5, 'cm') ) + labs(title = "CRM First Pass Yield") + scale_fill_manual(values = c( "No Rework" = "yellowgreen", "Content Rework" = "royalblue", "CO Rework" = "steelblue1" ))
关键参数说明
- 文本图层单独指定筛选后的数据集:不会对其余两类返工状态生成标签,完全匹配仅展示No Rework占比的需求
- 用
position_stack自动计算标签位置:不需要手动累加每个季度的总样本数来设置标签y坐标,无论堆叠填充的顺序怎么调整,标签都会自动对齐到堆叠条形的最上端,不会出现位置偏移 vjust = 1.1的微调:vjust=1对应堆叠结构的最上边界,微调数值可以控制标签和条形顶端的间距,需要更紧凑就调低数值,需要更宽松就调高数值- 筛选条件加入
count > 0:自动过滤2019年所有计数为0的空行,避免在无有效数据的位置生成无效标签
内容的提问来源于stack exchange,提问作者Matt Simonson
相关产品推荐
相关产品推荐

