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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:27:03