Этот пример смеси наденет меня на правильный путь.
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")
Просто некоторые выборочные данные, не стесняйтесь изменять его по своему усмотрению. Сначала мне пришлось перепутать данные в правильном формате.
# 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"
]
Это выглядело, как ваш формат дата был «день-месяц-год» - я использовал dateutil.parser так панда признает ее должным образом.
# Format data as pandas datetime objects with day-first custom
days = []
days.append(parse(x, dayfirst=True) for x in dates)
Вы также нуждались в этом сгруппированы по месяцам - я панды ресэмплировать к декодируют даты, получить соответствующие значения для каждого месяца, и сливаются в dataframe.
# 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 позволяет использовать индекс панд dataframe в качестве значений х Картографических, как discussed here но это не так, как значений даты-времени, поэтому я добавил новый столбец для метки даты. См. Комментарий о таймсерах ниже ***.
# You can use DataFrame index for bokeh x values but it doesn't like timestamp
frame['Month'] = frame.index.strftime('%m-%Y')
И наконец, мы добираемся до чертежной части. Так же, как пример олимпийской медали, мы передаем некоторые доводы Бар. Играйте с ними, но вам нравится, но примечание, что я добавил легенду, построив ее за пределами диаграммы в целом. Если у вас много точек данных, он становится очень грязным на графике, как он строится здесь.
# 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))
Если скопировать/вставить этот код, это то, что вы будете показать.
Если вы сами визуализируете его или используете его: наведите указатель мыши на каждый блок, чтобы увидеть всплывающие подсказки (значения).
Я не отринул все, что мог (на ум приходят цветы).
Это тип диаграммы, которую вы хотели построить, но, похоже, другой стиль диаграммы будет отображать данные более информативно, поскольку суммарные суммы (min + mean + max) не предоставляют значимой информации. Но я не знаю, каковы ваши данные.
*** Вы можете подумать о timeseries chart. Это может устранить некоторые из данных, которые были сделаны до построения графика.
Вы также можете рассмотреть grouping your bars вместо укладки их. Таким образом, вы можете легко визуализировать номера каждого месяца.