ggplot2 geom_col保留fill分类映射时如何在柱顶标注y轴总值
堆叠柱状图柱顶标注总和实现方案
相关示例

需求说明
基于msleep数据集绘制堆叠柱状图,将fill美学属性映射到genus分类变量:
- 保留原有的
genus分类填充映射逻辑 - 移除原有代码在每个堆叠分片上的零散数值标注
- 仅在每根完整柱子的顶部,标注该柱所有堆叠分片的
sleep_total总和值
原有问题代码
msleep %>% ggplot(aes(order, sleep_total, fill = genus))+ geom_col()+ geom_text(aes(label = sleep_total), position = position_stack(vjust = 0.5), size =3)+ theme_minimal()
原有代码直接基于原始分片数据集做文本标注,因此标注会默认落在每个堆叠块内部,不符合需求。
正确实现代码
核心逻辑是提前按x轴分类(order)分组计算每根柱子的总睡眠时长,单独传入汇总数据集做柱顶标注,不需要对标注文本做堆叠位置调整:
library(ggplot2) library(dplyr) # 提前按order分组,计算每个分类下的sleep_total总和 msleep_sum <- msleep %>% group_by(order) %>% summarise( total = sum(sleep_total, na.rm = TRUE), .groups = "drop" ) msleep %>% ggplot(aes(x = order, y = sleep_total, fill = genus)) + geom_col() + # 传入汇总后的数据集做顶部标注 geom_text( data = msleep_sum, aes(x = order, y = total, label = round(total, 1)), size = 3, vjust = -0.2 # 调整标注位置,避免和柱顶重叠 ) + theme_minimal()
参数调整说明
na.rm = TRUE:跳过sleep_total字段中的缺失值,避免求和结果返回NAround(total, 1):将总和值保留1位小数,可根据展示需求调整保留位数vjust = -0.2:控制标注和柱顶的垂直间距,数值越大标注越靠下,可根据画布尺寸、字体大小灵活调整
内容的提问来源于stack exchange,提问作者Nate Specht
相关产品推荐
相关产品推荐

