簡體   English   中英

在繪圖 Python 中獲取峰值

[英]Get Peaks in Plot Python

我有以下數據:

data = np.array([ 0.,  0.,  0., 94., 30., 30., 30., 31., 29., 30., 29., 28., 26.,
       29., 28., 29., 31., 32., 31., 29., 31., 31., 30., 34., 28., 31.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  2.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., 54.,  9.,  9.,  7.,  7.,
       14., 18., 13.,  8.,  2.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.])

如果我繪制它,它看起來像這樣:

在此處輸入圖片說明

現在,我想自動識別紅色的點。 知道我該怎么做嗎?

編輯:嘗試scipy.signal ,但它沒有正確檢測峰值,至少在默認配置下:

from matplotlib import pyplot as plt
from scipy.signal import find_peaks
peaks, _ = find_peaks(data, height=20)
plt.plot(data)
plt.plot(peaks, data[peaks], "x")
plt.show()

在此處輸入圖片說明

scipy.signal工作(至少大多數時候),如果你給它正確的平滑。 您還可以使用小波變換( find_peaks_cwt ),它使用小波進行平滑處理,因此對於嘈雜的數據比find_peaks稍微好一點

from matplotlib import pyplot as plt
from scipy.signal import find_peaks_cwt
peaks = find_peaks_cwt(data, widths=np.ones(data.shape)*2)-1
plt.plot(data)
plt.plot(peaks, data[peaks], "x")
plt.show()

在此處輸入圖片說明

有道格拉斯-普克算法,見https://stackoverflow.com/a/49377181/562769

這個想法是簡化那條線,直到只剩下最相關的點。 然后,您將每個點都取超過閾值(例如,高於平均值),然后您就會得到峰值。

依稀記得scipy信號處理有更復雜的方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM