peak_widths(x, peaks, rel_height=0.5, prominence_data=None, wlen=None)
This function calculates the width of a peak in samples at a relative distance to the peak's height and prominence.
The basic algorithm to calculate a peak's width is as follows:
As shown above to calculate a peak's width its prominence and bases must be known. You can supply these yourself with the argument prominence_data. Otherwise, they are internally calculated (see peak_prominences).
A signal with peaks.
Indices of peaks in x.
Chooses the relative height at which the peak width is measured as a percentage of its prominence. 1.0 calculates the width of the peak at its lowest contour line while 0.5 evaluates at half the prominence height. Must be at least 0. See notes for further explanation.
A window length in samples passed to peak_prominences as an optional argument for internal calculation of prominence_data. This argument is ignored if prominence_data is given.
If prominence_data is supplied but doesn't satisfy the condition 0 <= left_base <= peak <= right_base < x.shape[0]
for each peak, has the wrong dtype, is not C-contiguous or does not have the same shape.
The widths for each peak in samples.
The height of the contour lines at which the widths where evaluated.
Interpolated positions of left and right intersection points of a horizontal line at the respective evaluation height.
Calculate the width of each peak in a signal.
Raised if any calculated width is 0. This may stem from the supplied prominence_data or if rel_height is set to 0.
find_peaks
peak_prominences
import numpy as np
from scipy.signal import chirp, find_peaks, peak_widths
import matplotlib.pyplot as plt
x = np.linspace(0, 6 * np.pi, 1000)
x = np.sin(x) + 0.6 * np.sin(2.6 * x)
peaks, _ = find_peaks(x)
results_half = peak_widths(x, peaks, rel_height=0.5)
results_half[0] # widths
results_full = peak_widths(x, peaks, rel_height=1)
results_full[0] # widths
plt.plot(x)
plt.plot(peaks, x[peaks], "x")
plt.hlines(*results_half[1:], color="C2")
plt.hlines(*results_full[1:], color="C3")
plt.show()
Hover to see nodes names; edges to Self not shown, Caped at 50 nodes.
Using a canvas is more power efficient and can get hundred of nodes ; but does not allow hyperlinks; , arrows or text (beyond on hover)
SVG is more flexible but power hungry; and does not scale well to 50 + nodes.
All aboves nodes referred to, (or are referred from) current nodes; Edges from Self to other have been omitted (or all nodes would be connected to the central node "self" which is not useful). Nodes are colored by the library they belong to, and scaled with the number of references pointing them