können Sie scipy
argrelextrema verwenden, um alle Spitzen zu bekommen, um die maximalen trainieren und anschließend ein Maskenfeld für die Spitzen Sie zeichnen mögen aufzubauen. Dies gibt Ihnen die volle Kontrolle über Ihre Daten, Dinge wie mincutoff mit zu arbeiten, was eine separate Spitze bestimmt,
import numpy as np
from scipy.signal import argrelextrema
import matplotlib.pyplot as plt
#Setup and plot data
fig, ax = plt.subplots(1,2)
y = np.array([0,0,0,0,0,6.14,7.04,5.6,0,0,0,0,0,0,0,0,0,0,0,16.58,60.06,99.58,100,50,0.,0.,0.])
x = np.linspace(3.92,161,y.size)
ax[0].plot(x,y)
#get peaks
peaks_indx = argrelextrema(y, np.greater)[0]
peaks = y[peaks_indx]
ax[0].plot(x[peaks_indx],y[peaks_indx],'o')
#Get maxpeak
maxpeak = 0.
for p in peaks_indx:
print(p)
if y[p] > maxpeak:
maxpeak = y[p]
maxpeak_indx = p
#Get mask of data around maxpeak to plot
mincutoff = 0.
indx_to_plot = np.zeros(y.size, dtype=bool)
for i in range(maxpeak_indx):
if y[maxpeak_indx-i] > mincutoff:
indx_to_plot[maxpeak_indx-i] = True
else:
indx_to_plot[maxpeak_indx-i] = True
break
for i in range(y.size-maxpeak_indx):
if y[maxpeak_indx+i] > mincutoff:
indx_to_plot[maxpeak_indx+i] = True
else:
indx_to_plot[maxpeak_indx+i] = True
break
ax[1].plot(x[indx_to_plot],y[indx_to_plot])
plt.show()
Das Ergebnis ist dann,
UPDATE: Code plotten nur der größte Gipfel.
import numpy as np
from scipy.signal import argrelextrema
import matplotlib.pyplot as plt
#Setup and plot data
y = np.array([0,0,0,0,0,6.14,7.04,5.6,0,0,0,0,0,0,
0,0,0,0,0,16.58,60.06,99.58,100,50,0.,0.,0.])
x = np.linspace(3.92,161,y.size)
#get peaks
peaks_indx = argrelextrema(y, np.greater)[0]
peaks = y[peaks_indx]
#Get maxpeak
maxpeak = 0.
for p in peaks_indx:
print(p)
if y[p] > maxpeak:
maxpeak = y[p]
maxpeak_indx = p
#Get mask of data around maxpeak to plot
mincutoff = 0.
indx_to_plot = np.zeros(y.size, dtype=bool)
for i in range(maxpeak_indx):
if y[maxpeak_indx-i] > mincutoff:
indx_to_plot[maxpeak_indx-i] = True
else:
indx_to_plot[maxpeak_indx-i] = True
break
for i in range(y.size-maxpeak_indx):
if y[maxpeak_indx+i] > mincutoff:
indx_to_plot[maxpeak_indx+i] = True
else:
indx_to_plot[maxpeak_indx+i] = True
break
#Plot just the highest peak
plt.plot(x[indx_to_plot],y[indx_to_plot])
plt.show()
ich noch beiden Spitzen Plotten würde vorschlagen, der Algorithmus richtig funktioniert, um sicherzustellen, ... Ich glaube, Sie werden feststellen, dass eine beliebige Spitze zu identifizieren ist wahrscheinlich nicht immer trivial mit unordentlich Daten.
Was bedeutet "wählen Sie nur die höchste Spitze beim Zeichnen und verwerfen die niedrigsten Spitze (n)"? Angenommen, Sie haben den höchsten Peak in der Grafik gefunden. Was genau ist der nächste Schritt, den Sie machen möchten? –
Die Eingabe ist eine Menge von Datenpunkten (x, y), wenn ich grafierte, bekomme ich mehrere Peaks. Ich möchte aber nur, dass der Graph einen einzelnen und höchsten Peak hat, was der Output ist, der Graph des höchsten Peaks von Datenpunkten und das ist was ich will! danke – aBiologist
Könnten Sie den Screenshot der erhaltenen Plots anhängen? Es ist wirklich unmöglich, das Problem ohne adäquate Daten/Ausgabe zu reproduzieren. –