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

如何在ggplot分面图中纳入sample_start与sample_end采样时间窗口

解决方法

要给每个分面子图加上采样窗口,核心是先把每个recording对应的sample_start和sample_end整理成独立数据集,再用ggplot的图层把窗口画进去,具体步骤如下:

1. 整理采样窗口数据

首先从原数据中提取每个recording对应的采样起止时间,去重(每个recording应该只有一组采样窗口),同时对时间做和事件数据一致的log转换,保证坐标轴统一:

# 提取并整理采样窗口数据,每个recording只保留一行
window_df <- df %>%
  mutate(recording = str_remove(recording, "^.+?_.+?_")) %>%  # 和原代码统一处理recording标签
  distinct(recording, sample_start, sample_end) %>%  # 去重,保留每个recording的唯一窗口
  mutate(
    sample_start_log = log(sample_start),
    sample_end_log = log(sample_end)
  )

2. 在原绘图代码中添加采样窗口图层

用geom_rect绘制采样窗口(矩形比线段更直观展示范围),注意指定窗口数据为window_df,并调整图层顺序让窗口在事件线段下方:

修改后的完整代码:

library(tidyverse)

# 先处理窗口数据
window_df <- df %>%
  mutate(recording = str_remove(recording, "^.+?_.+?_")) %>%
  distinct(recording, sample_start, sample_end) %>%
  mutate(
    sample_start_log = log(sample_start),
    sample_end_log = log(sample_end)
  )

# 原绘图代码修改
df %>%
  mutate(recording = str_remove(recording, "^.+?_.+?_")) %>%
  mutate(Starttime_ms = log(time),
         Endtime_ms = log(time) + 0.01) %>%
  ggplot(aes(x = Starttime_ms, xend = Endtime_ms,
             y = recording, yend = recording,
             color = setting)) +
  # 先画采样窗口(底层)
  geom_rect(
    data = window_df,
    aes(
      xmin = sample_start_log,
      xmax = sample_end_log,
      ymin = as.numeric(factor(recording)) - 0.4,  # 调整y范围让窗口贴合recording行
      ymax = as.numeric(factor(recording)) + 0.4,
      color = NULL,  # 取消继承原aes的color,避免和事件线段混淆
      fill = "lightblue"  # 设置窗口填充色
    ),
    alpha = 0.3  # 调整透明度,不遮挡事件线段
  ) +
  # 再画事件线段(上层)
  geom_segment(size = 7) +
  facet_wrap(~ recording, scales = "free_x", ncol = 2) +
  theme(
    axis.text.y = element_blank(),
    axis.ticks.y = element_blank(),
    legend.position = "none"
  )

关键细节说明

  • geom_rect的ymin和ymax用as.numeric(factor(recording))获取每个recording对应的y轴位置,加减0.4是为了让窗口高度和事件线段的行高匹配,可根据实际显示效果调整数值。
  • 必须给geom_rect单独指定data = window_df,并重置color = NULL,避免继承原图层的color=setting映射。
  • 调整alpha透明度能让窗口不遮挡事件线段,方便观察事件在采样窗口内的分布。

如果更倾向于用线段标记窗口起止点,可替换为geom_vline:

geom_vline(
  data = window_df,
  aes(xintercept = sample_start_log),
  color = "red", linetype = "dashed"
) +
geom_vline(
  data = window_df,
  aes(xintercept = sample_end_log),
  color = "red", linetype = "dashed"
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:33:21