如何用ggplot2或ggpubr绘制带误差棒和p值的每日处理均值折线图
实现步骤
直接按以下步骤操作即可完成统计分析与绘图,所有代码可直接运行适配你的数据集:
1. 加载依赖包
# 未安装包的话先运行:install.packages(c("tidyverse", "ggpubr", "rstatix")) library(tidyverse) library(ggpubr) library(rstatix)
2. 数据格式转换
你提供的原始数据是宽格式,需要转为长格式才能适配ggplot2绘图逻辑:
# 读入数据,以下是示例数据导入代码,你实际使用时替换为自己的读表代码即可 pig_data <- tribble( ~PIG, ~TRT, ~DAY0, ~DAY15, ~WEAN, 1, "SOY", 1.48, 5.22, 8.35, 2, "SOY", 1.44, 5.07, 7.76, 3, "SOY", 1.66, 5.30, 9.46, 4, "LIN", 1.94, 5.91, 10.10, 5, "LIN", 1.54, 4.96, 9.01, 6, "LIN", 1.68, 5.56, 9.52 ) # 转为长格式,同时固定x轴时间点的展示顺序 pig_long <- pig_data %>% pivot_longer(cols = c(DAY0, DAY15, WEAN), names_to = "Time", values_to = "Weight") %>% mutate(Time = factor(Time, levels = c("DAY0", "DAY15", "WEAN")))
3. 统计检验计算组间p值
你需要的组间比较p值可以按时间点分别计算两组差异,如果要做多次检验校正也可以直接调整:
# 按时间点分组,计算每个称重日两个处理组的差异p值 p_vals <- pig_long %>% group_by(Time) %>% # 如果数据不符合正态分布,把t_test换成wilcox_test即可 t_test(Weight ~ TRT) %>% # 可选步骤:多次检验校正,用Bonferroni法 adjust_pvalue(method = "bonferroni") %>% # 自动计算p值在图上的标注位置 add_xy_position(x = "Time", dodge = 0.2)
如果要考虑猪只个体的重复测量效应,可运行以下代码做重复测量方差分析:
res_aov <- pig_long %>% anova_test(dv = Weight, wid = PIG, within = Time, between = TRT) # 输出方差分析结果 get_anova_table(res_aov)
4. 绘制目标折线图
用ggpubr可以一键生成带均值、误差棒的折线图,直接叠加提前算好的p值即可:
ggline(pig_long, x = "Time", y = "Weight", color = "TRT", # 按处理组分颜色 add = c("mean_se", "jitter"), # 展示均值±标准误,可选叠加原始数据散点 palette = c("#00AFBB", "#E7B800"), # 自定义两组的配色 position = position_dodge(0.2)) + # 自定义误差棒宽度 geom_errorbar(aes(ymin = ..y.. - ..se.., ymax = ..y.. + ..se..), width = 0.1, position = position_dodge(0.2), stat = "summary") + # 叠加组间比较p值 stat_pvalue_manual(p_vals, label = "p = {p}", tip.length = 0.01) + # 调整坐标轴与图例标注 labs(x = "称重日", y = "体重 (kg)", color = "处理组") + theme_classic()
可调参数说明
- 误差棒默认展示均值±标准误,如果要换成均值±标准差,把
add = c("mean_se")改成add = c("mean_sd")即可 - 不需要展示原始散点的话,删掉
add参数里的"jitter"即可 - 要显示校正后的p值的话,把
label = "p = {p}"改成label = "p.adj = {p.adj}"即可
内容的提问来源于stack exchange,提问作者Yron Manaig
相关产品推荐
相关产品推荐

