You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 04:57:06