2016-06-19 4 views
3

Ich möchte ein Bokeh-Diagramm, das eine ColumnDataSource verwendet. Die pandasDataFrame, die die Quelle der Daten hat eine Spalte und einen datetime Index:Plot ein Pandas Datenframe mit dem Dataframe-Index für x-Koordinate in Bokeh

enter image description here

Wie gebe ich, dass der x-Wert der Index sein sollte. Ich habe versucht, das Weglassen nur darauf, dass der Standard wäre die Hoffnung, aber es hat nicht funktioniert:

enter image description here

Es eine hässliche Lösung ist, wo ich den Index als eine Spalte in dem Datenrahmen einfach kopieren, aber ich hoffe, dass es ist eine elegantere Lösung:

enter image description here enter image description here

Antwort

5

Das Problem ist, dass Sie die Spalte sollte die „x“ Spalte angeben müssen. Wenn Sie den Wert "x" nicht angeben, versucht bokeh.plotting standardmäßig, in Ihrer ColumnDataSource (die nicht existiert) eine Spalte namens "x" zu finden.

Eine schwierige Sache hier ist, dass Sie einen benannten Index ("Zeitreihen") in Pandas verwenden. Dieser Name wird übernommen, wenn Sie eine ColumnDataSource erstellen, so dass Ihre Quelle wahrscheinlich wie folgt aussieht:

ds = ColumnDataSource(df) 
print(ds.data) 
# the ts_n values would be the actual timestamps from the df 
> {'timestamp': [ts_1, ts_2, ts_3, ts_4, ts_5], 'avg': [0.9, 0.8, 0.7, 0.8, 0.9]} 

Es würde funktionieren, wenn Sie verwenden:

p.line(source=ds, x='timestamps', y='avg') 
+0

Ich sehe, ich wusste nicht, dass Indizes (im Gegensatz zu normalen Spalten) benannt werden können. Vielen Dank. – Krastanov

4

ich den Index in der Regel zurückgesetzt und dies den Index eine Spalte macht. Ähnlich wie deine hässliche Lösung. Zeichnen Sie dann die angegebenen Spalten.

df.reset_index(inplace = True) 

Alternativ könnten Sie einfach die Spalte verweisen und in matplotlib verwendet sie in der Regel den Index standardmäßig in der Art und Weise Sie wollen. Nicht sicher, ob es für Sie funktioniert, aber einen Versuch wert.

df["avg"].plot() 

Alternativ könnten Sie versuchen, die Zeitreihe Plot Ansatz? Weiter unten beschrieben.

TimeSeries in Bokeh using a dataframe with index

2

Sie den Index mit der üblichen Syntax aufrufen können bekomme einen Index von DF als:
p.line(x = df.index.values, y = df['values_for_y'])

+0

Aber dann verwenden Sie kein explizites gemeinsames Datenframe (das Quellschlüsselwortargument), das die schickeren interaktiven Mehrachsenzahlen verkompliziert, die Sie auf einfache Subplots bauen möchten. – Krastanov

Verwandte Themen