Python находит пики — неправильная ось x

#python #matplotlib #scipy

#python #matplotlib #scipy

Вопрос:

я получил следующий код:

 Frequency = df['x [Hz]']
Spectrum = df['test_spec']

x = Spectrum
peaks, _ = find_peaks(x, distance=20)
plt.plot(peaks, x[peaks], "xr"); plt.plot(x); plt.legend(['distance'])
plt.show()
 

Переменная «Частота» содержит частоты октавного спектра третьей полосы частот от 5 до 315 Гц. «Спектр» содержит связанные уровни шумового давления. Теперь я хочу найти пики в этом спектре. нужное мне значение — это частота, на которой находится пик.

Проблема в том, что на графике показана ось x с шагами 0,5,10,15, но я хочу масштаб по оси x с моими частотами, сохраненными в переменной «Частота».

Надеюсь, вы сможете мне помочь.

Спасибо за вашу поддержку.

Ответ №1:

Документация find_peaks() может быть немного запутанной, поскольку она вызывает свой ввод x , в то время как в большинстве ситуаций этот ввод будет отображаться по оси y. find_peaks() не заботится об оси x, предполагая, что она такая же, как индекс массива ( 0,1,2,... ).

Чтобы нарисовать свою кривую, вам нужно построить график с использованием Frequency по оси x и Spectrum по оси y. Вы можете визуализировать пики, используя их в качестве индекса в обоих массивах:

 import matplotlib.pyplot as plt
from scipy.signal import find_peaks
import numpy as np

Frequency = np.linspace(5, 315, 200)
Spectrum = np.random.randn(200).cumsum()
Spectrum  = 1 - Spectrum.min()

peaks, _ = find_peaks(Spectrum, distance=20)
plt.plot(Frequency[peaks], Spectrum[peaks], "xr")
plt.plot(Frequency, Spectrum)
plt.legend(['distance'])
plt.tight_layout()
plt.show()
 

пример графика

Комментарии:

1. Спасибо вам оооочень большое!! Я застрял на этом уже целый час! И все примеры, которые я нашел в Интернете, игнорируют эту маленькую, но важную деталь.