2016-08-08 17 views
-1

Ich habe zwei Spalten, die der x- und y-Achse entsprechen würden, in der ich diese Datenpunkte schließlich zu einer Kurve wie Graphen graphisch darstellen werde. Das Problem ist, dass ich auf der Grundlage der Art der Datenpunkte, wenn ich es grafiere, am Ende zwei Peaks habe, aber ich möchte nur den höchsten Peak auswählen, wenn ich den niedrigsten Peak (s) abbilde und verwerfe höchster Punkt, aber der gesamte höchste geographische Graph).
Betrachten der höchsten Peakkurve aus zwei Datensätzen

Gibt es weg, um das in Python zu tun? Ich zeige die Codes hier nicht, weil ich nicht sicher bin, wie man die Codierung überhaupt macht.

Hier sind die Datenpunkte (Eingabe) sowie das Diagramm!

enter image description here

enter image description here

+0

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? –

+0

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

+0

Könnten Sie den Screenshot der erhaltenen Plots anhängen? Es ist wirklich unmöglich, das Problem ohne adäquate Daten/Ausgabe zu reproduzieren. –

Antwort

1

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,

enter image description here

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.

+0

, warum die zweite Zahl nicht von y = 0 beginnt, anstatt y etwa 17? – aBiologist

+0

Es ist nur ein Ergebnis der if-Bedingung größer als 'mincutoff = 0.'. Ich habe geändert, um die ersten Nullwerte zum Plot hinzuzufügen. In der Praxis würde ich annehmen, dass die Daten nicht immer sauber auf Null gehen würden, daher ist es am besten, bei Mincutoff zu stoppen. –

+0

Danke, wie man die Anzeige des Graphen steuern kann, ich meine, es gibt zwei Graphen, wie kann ich nur die richtige Grafik darstellen? – aBiologist