2016-09-08 11 views
1

Ich versuche, ein Balkendiagramm aus einem Datenrahmen df in Python Bokeh-Bibliothek zu erstellen. Die Daten, die ich einfach haben wie folgt aussieht:Python Bokeh - Blending

value datetime 
5 01-01-2015 
7 02-01-2015 
6 03-01-2015 
... ... (for 3 years) 

Ich möchte ein Balkendiagramm haben, die 3 bar pro Monat zeigt:

  • eine Bar für den Mittelwert von ‚Wert‘ für den Monat
  • eine Bar für den MAX von ‚Wert‘ für den Monat
  • eine Bar für den Mittelwert von ‚Wert‘ für den Monat

ich in der Lage bin zu schaffen ein Balkendiagramm jeder MEAN/MAX/MIN mit:

from bokeh.charts import Bar, output_file, show 
p = Bar(df, 'datetime', values='value', title='mybargraph', 
     agg='mean', legend=None) 
output_file('test.html') 
show(p) 

Wie konnte ich die 3 bar haben (Mittelwert, max, min) auf dem gleichen Grundstück? Und wenn möglich übereinander gestapelt.

Es sieht aus wie blend könnte mir helfen (wie in diesem Beispiel: http://bokeh.pydata.org/en/latest/docs/gallery/stacked_bar_chart.html), aber ich kann keine detaillierten Erklärungen finden, wie es funktioniert. Die Bokeh-Website ist erstaunlich, aber für diesen bestimmten Artikel ist es nicht wirklich detailliert.

Wer mir helfen?

Antwort

2

Dieses Mischbeispiel brachte mich auf den richtigen Weg.

import pandas as pd 
from pandas import Series 
from dateutil.parser import parse 
from bokeh.plotting import figure 
from bokeh.layouts import row 
from bokeh.charts import Bar, output_file, show 
from bokeh.charts.attributes import cat, color 
from bokeh.charts.operations import blend 

output_file("datestats.html") 

Nur ein paar Beispieldaten, fühlen sich frei, es zu ändern, wie Sie sehen, passen. Zuerst musste ich die Daten in ein richtiges Format streiten.

# Sample data 
vals = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 
dates = ["01-01-2015", "02-01-2015", "03-01-2015", "04-01-2015", 
     "01-02-2015", "02-02-2015", "03-02-2015", "04-02-2015", 
     "01-03-2015", "02-03-2015", "03-03-2015", "04-03-2015" 
     ] 

Es ist wie Ihr Datumsformat aussah, war „Tag-Monat-Jahr“ - ich verwendet, um die dateutil.parser so Pandas es richtig erkennen würde.

# Format data as pandas datetime objects with day-first custom 
days = [] 
days.append(parse(x, dayfirst=True) for x in dates) 

Sie benötigt es auch nach Monat gruppiert - ich verwendet Pandas resamplen die Daten zu Downsampling, die entsprechenden Werte für jeden Monat erhalten, und in einen Datenrahmen verschmelzen.

# Put data into dataframe broken into min, mean, and max values each for month 
ts = Series(vals, index=days[0]) 
firstmerge = pd.merge(ts.resample('M').min().to_frame(name="min"), 
         ts.resample('M').mean().to_frame(name="mean"), 
         left_index=True, right_index=True) 
frame = pd.merge(firstmerge, ts.resample('M').max().to_frame(name="max"), 
       left_index=True, right_index=True) 

Bokeh ermöglichen es Ihnen, die Pandas Datenrahmen-Index als die Diagramm x Werte zu verwenden, als discussed here aber es hat nicht wie die Datums- und Uhrzeitwerte, damit ich eine neue Spalte für Datum Etiketten hinzugefügt. Siehe folgenden Kommentar der Zeitreihe ***.

# You can use DataFrame index for bokeh x values but it doesn't like timestamp 
frame['Month'] = frame.index.strftime('%m-%Y') 

Endlich kommen wir zum Diagrammteil. Genau wie das olympische Medaillenbeispiel geben wir Bar einige Argumente. Spielen Sie mit diesen aber wie Sie möchten, aber Hinweis, dass ich die Legende hinzugefügt, indem Sie es außerhalb des Diagramms insgesamt. Wenn Sie viele Datenpunkte haben, wird es sehr chaotisch auf dem Diagramm, wie es hier gebaut wird.

# Main object to render with stacking 
bar = Bar(frame, 
      values=blend('min', 'mean', 'max', 
         name='values', labels_name='stats'), 
      label=cat(columns='Month', sort=False), 
      stack=cat(columns='values', sort=False), 
      color=color(columns='values', 
         palette=['SaddleBrown', 'Silver', 'Goldenrod'], 
         sort=True), 
      legend=None, 
      title="Statistical Values Grouped by Month", 
      tooltips=[('Value', '@values')] 
     ) 

# Legend info (displayed as separate chart using bokeh.layouts' row) 
factors = ["min", "mean", "max"] 
x = [0] * len(factors) 
y = factors 
pal = ['SaddleBrown', 'Silver', 'Goldenrod'] 
p = figure(width=100, toolbar_location=None, y_range=factors) 
p.rect(x, y, color=pal, width=10, height=1) 
p.xaxis.major_label_text_color = None 
p.xaxis.major_tick_line_color = None 
p.xaxis.minor_tick_line_color = None 

# Display chart 
show(row(bar, p)) 

Bokeh_output

Wenn Sie kopieren/diesen Code einfügen, ist es das, was Sie zeigen.
Wenn Sie es selbst rendern oder wenn Sie es bedienen: Bewegen Sie den Mauszeiger über jeden Block, um die QuickInfos (Werte) zu sehen.

Ich habe nicht alles abstrahiert (Farben kommen mir in den Sinn).

Dies ist die Art von Diagramm, die Sie erstellen wollten, aber es scheint, als würde ein anderer Diagrammstil die Daten informativer darstellen, da gestapelte Summen (Min + Mittelwert + Max) keine aussagekräftigen Informationen liefern. Aber ich weiß nicht, was deine Daten wirklich sind.

*** Sie könnten eine timeseries chart betrachten. Dies könnte einige Datenschlingen vor dem Plotten entfernen.

Sie könnten auch grouping your bars betrachten anstatt sie zu stapeln. Auf diese Weise können Sie die monatlichen Zahlen leicht visualisieren.