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

如何在R中查找时间序列的首个极值(峰值/谷值)并提取对应数值

提取ggpmisc stat_peaks/stat_valleys识别到的极值数值的方案

方法1:直接提取ggplot图层计算结果(与可视化标记完全一致)

stat_peaks和stat_valleys在渲染绘图时已经完成了极值计算,直接提取ggplot对象的内置图层数据即可,不需要重新运行算法:

library(ggplot2)
library(ggpmisc)
library(data.table)
library(magrittr)

# 示例数据
data <- data.table(x = c(1, 2, 3, 4, 5, 6, 7, 8),
                   y = c(1, -1, 2, 3, 3, 1, 3, 1))

# 将原绘图代码的结果赋值给ggplot对象
p <- data %>%
  ggplot(aes(x = x, y = y)) +
  geom_line() +
  stat_peaks(col = "red", span = NULL, ignore_threshold = 0.01) +
  stat_valleys(col = "blue", span = NULL, ignore_threshold = 0.01)

# 提取峰值数据:geom_line是第1个图层,stat_peaks为第2个图层
peaks_res <- layer_data(p, i = 2)
# 提取谷值数据:stat_valleys为第3个图层
valleys_res <- layer_data(p, i = 3)

你需要的极值坐标和数值直接从peaks_res$x、peaks_res$y以及valleys_res$x、valleys_res$y中获取即可,和可视化标记的结果100%匹配。

方法2:适配find_peaks参数实现相同提取逻辑

find_peaks不支持span=NULL参数,而span=NULL对应的逻辑是判断点是否大于/小于所有相邻点,平峰取中间位置,你可以将span设置为大于序列长度的奇数,即可达到完全一致的效果:

# 提取峰值索引
peak_idx <- find_peaks(data$y, span = 7, ignore_threshold = 0.01)
# 对应峰值数据
peak_data <- data[peak_idx, ]

# 提取谷值索引
valley_idx <- find_valleys(data$y, span = 7, ignore_threshold = 0.01)
# 对应谷值数据
valley_data <- data[valley_idx, ]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:06:03