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

ggplot实用技巧:如何为折线/柱状图添加真实均值与标准差文本

解决方案:在ggplot折线图/柱状图中添加均值+标准差文本

需求说明

使用ggplot绘制单指标或多指标的折线图(或柱状图)时,在图表上添加真实的均值(mean)和标准差(sd)数值(而非mean(sd)占位格式),即每个数据分组的位置显示对应的具体均值和标准差数值。

工具包推荐

除基础tidyverse外,推荐使用ggpubr包——它封装了ggplot的常用统计绘图功能,能快速添加均值、标准差等统计文本,无需手动汇总数据,大幅简化代码。


示例代码与实现

1. 数据准备

library(tidyverse)
# 若未安装ggpubr,先执行安装:install.packages("ggpubr")
library(ggpubr)

# 生成可复现的示例数据
set.seed(123)
df = data.frame(
  year = rep(c("2019","2020", "2021","2022"), each = 100),
  math = rnorm(400, 10, 2),
  science = rnorm(400, 5, 1)
)

2. 单指标折线图(带均值+标准差文本)

修正原代码的警告(将size改为linewidth,移除line geom无效的width参数),并添加数值文本:

# 方法1:ggplot原生实现
df %>%
  ggplot(aes(x = year, y = math, group = 1)) +
  stat_summary(geom = "line", fun = "mean", linewidth = 1.2) +
  stat_summary(geom = "errorbar", fun.data = "mean_sdl", fun.args = list(mult=1), 
               width=0.2, linewidth = 1.2) + # 自动计算均值±1倍标准差
  stat_summary(geom = "text", fun.data = "mean_sdl", fun.args = list(mult=1),
               aes(label = sprintf("%.2f\n(%.2f)", ..y.., ..y.. - ..ymin..)),
               vjust = -1) + # 格式化文本:均值换行显示标准差
  theme_bw() +
  ylim(5, 15) # 调整y轴范围避免文本超出图表
# 方法2:ggpubr简化实现
ggline(df, x = "year", y = "math", add = "mean_sd", 
       add.params = list(label = TRUE, label.format = "%.2f\n(%.2f)"),
       linewidth = 1.2, errorbar.width = 0.2) +
  theme_bw() +
  ylim(5, 15)

3. 多指标折线图(带均值+标准差文本)

# 方法1:ggplot原生实现,先转长格式
df_long = df %>% pivot_longer(-year)

df_long %>%
  ggplot(aes(x = year, y = value, color = name, group = name)) +
  stat_summary(geom = "line", fun = "mean", linewidth = 1.2) +
  stat_summary(geom = "errorbar", fun.data = "mean_sdl", fun.args = list(mult=1),
               width=0.2, linewidth = 1.2) +
  stat_summary(geom = "text", fun.data = "mean_sdl", fun.args = list(mult=1),
               aes(label = sprintf("%.2f\n(%.2f)", ..y.., ..y.. - ..ymin..)),
               vjust = -1, position = position_dodge(0.3)) + # 多组文本错开避免重叠
  theme_bw() +
  ylim(3, 15)
# 方法2:ggpubr简化实现
ggline(df_long, x = "year", y = "value", color = "name", 
       add = "mean_sd", add.params = list(label = TRUE, label.format = "%.2f\n(%.2f)"),
       linewidth = 1.2, errorbar.width = 0.2, position = position_dodge(0.3)) +
  theme_bw() +
  ylim(3, 15)

关键说明

  • mean_sdl函数默认计算均值±1倍标准差,若需标准误可改用mean_se
  • sprintf("%.2f\n(%.2f)", ..y.., ..y.. - ..ymin..)中,..y..是均值,..y.. - ..ymin..为标准差数值,可通过调整%.2f控制小数位数
  • 多组数据时用position_dodge避免文本重叠
  • 柱状图场景只需将ggline替换为ggbarplot即可实现相同的统计文本添加效果

内容的提问来源于stack exchange,提问作者Luis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 10:45:55