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

R语言时间序列图添加参与者移动平均值中位数及四分位距

解决不同起始时间参与者的时间序列中位数与四分位距线绘制问题

问题核心

你的判断完全正确:由于各参与者的实验起始时间不同,原始的timestamp是绝对时间,无法在同一时间节点上聚合所有参与者的移动平均值,导致stat_summary生成的线混乱。解决思路是将绝对时间转换为相对时间(即参与者各自实验开始后的时长),这样就能对齐所有参与者的时间维度,再计算整体的中位数和四分位距。

步骤1:添加相对时间列

在数据处理阶段,给每个参与者的时间戳计算相对起始时间(单位选小时,更直观):

# 先将start_times转为data.table,方便匹配
start_dt <- data.table(participant = 1:18, start_time = start_times)
# 合并到主数据
df <- df[start_dt, on = "participant"]
# 计算相对时间(小时)
df[, relative_hour := as.numeric(difftime(timestamp, start_time, units = "hours"))]

步骤2:绘制对齐后的时间序列图

现在用relative_hour作为x轴,就能对齐所有参与者的时间维度,再用stat_summary计算中位数和四分位距:

ggplot(data = df, aes(relative_hour, moving_average)) +
  # 绘制各参与者的移动平均线,降低透明度突出整体趋势
  geom_line(aes(color = as.factor(participant)), alpha = 0.5) +
  # 添加中位数线,加粗黑色突出显示
  stat_summary(fun = median, geom = "line", color = "black", size = 1.2) +
  # 添加四分位距区间,用灰色丝带展示
  stat_summary(fun.data = median_hilow, fun.args = list(conf.int = 0.5), 
               geom = "ribbon", fill = "grey70", alpha = 0.3) +
  labs(y = "Activity levels", x = "Hours since experiment start") + 
  theme_classic() +
  # 设置x轴刻度,对应24小时实验时长
  scale_x_continuous(breaks = seq(0, 24, 4), expand = c(0, 0))

代码说明

  • relative_hour:将每个参与者的绝对时间戳转换为相对于自身起始时间的小时数,实现所有参与者的时间维度对齐。
  • stat_summary(fun = median):在每个相对时间点上,计算所有参与者移动平均值的中位数,绘制黑色粗线展示整体趋势。
  • stat_summary(fun.data = median_hilow):通过conf.int=0.5参数指定计算四分位距,用灰色半透明丝带展示数据的离散程度。
  • alpha参数:降低个体线条的透明度,避免干扰整体趋势的展示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:53:13