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_sesprintf("%.2f\n(%.2f)", ..y.., ..y.. - ..ymin..)中,..y..是均值,..y.. - ..ymin..为标准差数值,可通过调整%.2f控制小数位数- 多组数据时用
position_dodge避免文本重叠 - 柱状图场景只需将
ggline替换为ggbarplot即可实现相同的统计文本添加效果
内容的提问来源于stack exchange,提问作者Luis
相关产品推荐
相关产品推荐

