2016-04-15 11 views
1

Ich versuche, dieses Diagramm in Matplotlib mit meinen Daten zu replizieren, d. H. Ein Liniendiagramm mit vertikalen Linien, die die Änderungen zeigen, wo positive, negative oder flache Ableitung Änderungen auftreten.Plot Änderungen in Ableitungen von Liniendiagramm in Pandas

enter image description here

Ich habe eine pandas Datenrahmen mit dem diff als Derivat und einem Segmentwechsel jedes Mal erstellt es eine arbitray Bruch in der Ableitung, möchte ich mit der Zeit lat auf der y-Achse zum Plotten auf die x-Achse und eine vline, wenn die Segmentnummer unterbrochen ist.

 lat    time trip_id  diff shifted Segment 
-7.11559 2015-12-16 21:53:47 17601 0.00446 0.00003  0 
-7.11559 2015-12-16 21:53:45 17601 0.00000 0.00446  1 
-7.11563 2015-12-16 21:53:41 17601 -0.00004 0.00000  2 
-7.11551 2015-12-16 21:48:29 17601 0.00012 -0.00004  2 
-7.11548 2015-12-16 21:48:27 17601 0.00003 0.00012  2 
-7.11545 2015-12-16 21:48:26 17601 0.00003 0.00003  2 
-7.11539 2015-12-16 21:48:25 17601 0.00006 0.00003  2 
-7.11548 2015-12-16 21:43:17 17601 -0.00009 0.00006  2 
-7.11545 2015-12-16 21:43:15 17601 0.00003 -0.00009  2 
-7.11545 2015-12-16 21:43:13 17601 0.00000 0.00003  3 
-7.11542 2015-12-16 21:43:12 17601 0.00003 0.00000  4 

kann ich die ersten 2 leicht genug, um mit df.plot(x='time',y='lat') plotten. Ich kämpfe jedoch mit der Logik darüber, wie man die vline zu einer Zeitachse hinzufügt und welche Parameter an die mplplotlib vline übergeben werden. Jede Hilfe oder Hinweise würden sehr geschätzt werden.

UPDATE 1.

ich diesen Code geschrieben haben, die sollte in meinem Kopf arbeiten, um dieses Problem zu lösen.

plotList=[] 
breaker = pd.unique(df.Segment.ravel()) 
def pullLine(row): 
    for i in breaker: 
     if any(row['Segment']) == i: 
      plotList.append(row['time']) 
# breaker is a list of unique segment numbers, this for loop should loop over breaker and then where the first instance of i == the segment number appending the time value to the list 
pullLine(df) 
print plotList 

fig,ax = plt.subplots() 

df.plot(x='Segment',y='lat') 
# this loops over `plotList` and should plot a `axvline` at each instance. 
for i in plotList: 
    plt.axvline(x = i,linewidth=2, color='r') 
plt.show() 

jedoch läuft den Code wie oben i KeyError: 0 auf dem plt.axvline immer bin. Wenn ich manuell ein Datum in die Zeile plt.axvline(x = '2015-12-24 21:51:45') einstecke, bekomme ich ValueError: invalid literal for float(): 2015-12-24 21:51:45.

Irgendwelche Ideen, wie man a) löst oder b) eine vline mit einer Zeitreihe auf der x-Achse druckt? Hilfe

Antwort

1

Hier ist, wie ich dieses Problem gelöst habe. Es funktioniert, aber braucht nur einige Feinabstimmungen, um alle kleinen Ableitungen in der Linie auszugleichen. Alle Ergänzungen oder Verbesserungen sind willkommen.

previous = None 
segnumber = 0 

def func(row): 
    global segnumber 
    previous = row['shifted'] 
    if row['diff'] > 0: 
     if previous < -0.5 or previous == 0: 
      segnumber = segnumber + 1 
     return segnumber 
    elif row['diff'] == 0: 
     if previous < -0.5 or previous > 0.5: 
      segnumber = segnumber + 1 
     return segnumber 
    elif row['diff'] < 0: 
     if previous > 0.5 or previous == 0: 
      segnumber = segnumber + 1 
     return segnumber 

df['Segment'] = df.apply(func, axis=1) 
df['dup'] = df.duplicated('Segment') 

plotList = df.loc[df['dup'] == False, 'time'].tolist() 

ax = df.plot(x='time',y='lat') 
for i in plotList: 
    plt.axvline(x=i) 
plt.show() 
1

dies vielleicht:

y_min, y_max = ax.get_ylim() 
ax.add_collections(matplotlib.collections.BrokenBarHCollection.span_where(
      x, ymin=y_min, ymax=y_max, where=[your condition], 
      facecolor='red', alpha=0.25) 

matplotlib für weitere Beispiele.

Verwandte Themen