2016-09-08 3 views
1

Я пытаюсь создать гистограмму из dataframe df в библиотеке Python Bokeh. Данные у меня просто выглядит следующим образом:Python Bokeh - смешивание

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

Я хотел бы иметь гистограмму, которая показывает 3 бара в месяц:

  • один бар для среднего «значения» в течение месяца
  • один бар для макс «значение» в течение месяца
  • один бар для среднего значения «» за месяц

я в состоянии создать одна гистограмма любой из MEAN/MAX/MIN с:

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) 

Как я мог иметь 3 бар (среднее, максимальное, мин) на том же участке? И, если возможно, сложены друг над другом.

Похоже, blend может мне помочь (как в этом примере: http://bokeh.pydata.org/en/latest/docs/gallery/stacked_bar_chart.html), но я не могу найти подробные объяснения того, как это работает. Сайт bokeh изумительный, но для этого конкретного предмета он не очень подробно.

Кто-нибудь может мне помочь?

ответ

2

Этот пример смеси наденет меня на правильный путь.

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

Bokeh_output

Если скопировать/вставить этот код, это то, что вы будете показать.
Если вы сами визуализируете его или используете его: наведите указатель мыши на каждый блок, чтобы увидеть всплывающие подсказки (значения).

Я не отринул все, что мог (на ум приходят цветы).

Это тип диаграммы, которую вы хотели построить, но, похоже, другой стиль диаграммы будет отображать данные более информативно, поскольку суммарные суммы (min + mean + max) не предоставляют значимой информации. Но я не знаю, каковы ваши данные.

*** Вы можете подумать о timeseries chart. Это может устранить некоторые из данных, которые были сделаны до построения графика.

Вы также можете рассмотреть grouping your bars вместо укладки их. Таким образом, вы можете легко визуализировать номера каждого месяца.

Смежные вопросы