2016-05-31 17 views
0

Ich habe ein Pandas-Datenfeld, das mehrere Felder hat. Die, die von Bedeutung sind:Plotten Pandas Datenrahmen mit String-Labels

In[191]: tasks[['start','end','appId','index']] 
Out[189]: 
      start    end       appId index 
2576 1464262540102.000 1464262541204.000 application_1464258584784_0012  1 
2577 1464262540098.000 1464262541208.000 application_1464258584784_0012  0 
2579 1464262540104.000 1464262541194.000 application_1464258584784_0012  3 
2583 1464262540107.000 1464262541287.000 application_1464258584784_0012  6 
2599 1464262540125.000 1464262541214.000 application_1464258584784_0012  26 
2600 1464262541191.000 1464262541655.000 application_1464258584784_0012  28 
. 
. 
. 
2701 1464262562172.000 1464262591147.000 application_1464258584784_0013  14 
2718 1464262578901.000 1464262588156.000 application_1464258584784_0013  28 
2727 1464262591145.000 1464262602085.000 application_1464258584784_0013  40 

ich eine Linie für jede Zeile darstellen möchten, die von den Koordinaten geht (x1 = Start, y1 = Index), (x2 = Ende, y1 = Index). Jede Zeile hat eine andere Farbe, abhängig vom Wert von appId, das eine Zeichenfolge ist. Dies alles geschieht in einem Teilplot, den ich in einem Zeitreihendiagramm habe. Ich poste den Code hier, aber das wichtige Bit ist der Teil tasks.iterrows(), Sie können den Rest ignorieren.

def plot_stage_in_host(dfm,dfg,appId,stageId,parameters,host): 
    [s,e] = time_interval_for_app(dfm, appId,stageId, host) 
    time_series = create_time_series_host(dfg, host, parameters, s,e) 
    fig,p1 = plt.subplots() 
    p2 = p1.twinx() 
    for para in parameters:   
     p1.plot(time_series.loc[time_series['parameter']==para].time,time_series.loc[time_series['parameter']==para].value,label=para) 
    p1.legend() 
    p1.set_xlabel("Time") 
    p1.set_ylabel(ylabel='%') 
    p1.set(ylim=(-1,1)) 
    p2.set_ylabel("TASK INDEX") 
    tasks = dfm.loc[(dfm["hostname"]==host) & (dfm["start"]>s) & (dfm["end"]<e) & (dfm["end"]!=0)] #& (dfm["appId"]==appId) & (dfm["stageId"]==stageId)] 
    apps = tasks.appId.unique() 
    norm = colors.Normalize(0,len(apps)) 
    scalar_map = cm.ScalarMappable(norm=norm, cmap='hsv') 
    for _,row in tasks.iterrows(): 
     color = scalar_map.to_rgba(np.where(apps == row['appId'])[0][0]) 
     p2.plot([row['start'],row['end']],[row['index'],row['index']],lw=4 ,c=color) 
    p2.legend(apps,loc='lower right') 
    p2.show() 

Das ist das Ergebnis, das ich bekomme.

enter image description here

Offenbar erwägt nicht die Etiketten und die Legende zeigt die gleichen Farben für alle Linien. Wie kann ich sie richtig beschriften und auch die Legende anzeigen?

Antwort

1

Das Problem besteht darin, dass Sie die Beschriftung jedes Mal zuweisen, wenn Sie das Diagramm in der for-Schleife mit dem label=-Argument zeichnen. Versuchen Sie, es zu entfernen und p2.lengend() eine Liste von Zeichenfolgen als Argument anzugeben, die die Etiketten darstellen, die Sie anzeigen möchten.

p2.legend(['label1', 'label2']) 

Wenn Sie eine andere Farbe zu jeder Zeile versuchen Sie Folgendes zuweisen:

import matplotlib.pyplot as plt 
import numpy as np 
xdata = [1, 2, 3, 4, 5] 
ydata = [[np.random.randint(0, 6) for i in range(5)], 
     [np.random.randint(0, 6) for i in range(5)], 
     [np.random.randint(0, 6) for i in range(5)]] 
colors = ['r', 'g', 'b'] # can be hex colors as well 
legend_names = ['a', 'b', 'c'] 
for c, y in zip(colors, ydata): 
    plt.plot(xdata, y, c=c) 
plt.legend(legend_names) 
plt.show() 

Es ergibt folgendes Ergebnis: enter image description here

hoffe, das hilft!

+0

! [Bild] (http://imgur.com/kUmYE2A). Immer noch das gleiche Problem. Ich bin mehr daran interessiert, für jede Zeile andere Farben zu erhalten als in der Legende selbst. – Brandon

+0

@Brandon hoffe, die aktualisierte Antwort hilft Ihnen. –

+0

Danke !. Ich habe es etwas anders gemacht, durch eine Farbkarte, die Ihrer Lösung sehr ähnlich ist. Allerdings habe ich Probleme beim Zeichnen der Legende, da es keine Labels gibt. Wie kann ich die Legende plotten? – Brandon