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))
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.