如何为ggplot2堆叠条形图添加指定数据标签及顶部总数值
解决方案
首先确保加载tidyverse包(包含ggplot2和dplyr):
library(tidyverse)
1. 修正数据标签(仅显示Mean_Minutes>100的数值)
你之前的ifelse语法存在错误,缺少else分支。正确写法是当Mean_Minutes>100时显示数值,否则返回NA(ggplot会自动隐藏NA标签)。同时调整标签位置到每个堆叠条形的中间,避免拥挤重叠。
2. 计算每日总耗时并添加顶部标签
先通过分组汇总生成每日总耗时的数据框,再用额外的geom_text将总数值添加到每个条形顶部。
完整代码如下:
# 计算每日总耗时 total_minutes <- Intensity_data %>% group_by(Weekday) %>% summarize(Total_Minutes = sum(Mean_Minutes)) # 绘制堆叠条形图 ggplot(Intensity_data, aes(x = Weekday, y = Mean_Minutes, fill = Activity_Level)) + geom_col() + # 仅显示Mean_Minutes>100的标签,居中放置在堆叠块内 geom_text(aes(label = ifelse(Mean_Minutes > 100, Mean_Minutes, NA)), size = 3, hjust = 0.5, vjust = 0.5, position = position_stack(vjust = 0.5)) + # 添加每日总耗时标签,放在条形顶部上方 geom_text(data = total_minutes, aes(x = Weekday, y = Total_Minutes, label = Total_Minutes, fill = NULL), size = 3.5, hjust = 0.5, vjust = -0.5) + labs(title = "Activity Level per Weekday", x = NULL, y = "Minutes") + guides(fill = guide_legend(title = "Activity Level")) + scale_fill_discrete(labels = c("Very Active", "Fairly Active", "Lightly Active", "Sedentary"))
关键说明:
- 数据标签控制:
ifelse(Mean_Minutes > 100, Mean_Minutes, NA)精准筛选显示的标签,position_stack(vjust=0.5)让标签居中在对应堆叠块内,彻底解决小条形标签拥挤问题。 - 总耗时标签:单独生成的
total_minutes数据框提供每日总和,fill=NULL避免继承主图的填充映射,vjust=-0.5将标签放在条形顶部上方,不会与堆叠块内容重叠。 - 若偏好标签在堆叠块上方,可将第一个
geom_text的vjust改回2,但居中位置的视觉效果更整洁。
内容的提问来源于stack exchange,提问作者Pablo Viruell
相关产品推荐
相关产品推荐

