Bokeh 0.13で、積み上げ面グラフを書く方法
環境
- Python3.6.5
- Bokeh 0.13.0
https://bokeh.pydata.org/en/latest/docs/gallery.html
やりたいこと
データ可視化ライブラリBokehを用いて、以下のような「積み上げ面グラフ」を作成したいです。
https://jp.cybozu.help/ja/k/user/graph_type 引用
Bokeh 0.12のときは、bokeh.charts.Area
を使って、簡単に書くことができます。
from bokeh.charts import Area, show, output_file, defaults
from bokeh.layouts import row
defaults.width = 400
defaults.height = 400
# create some example data
data = dict(
python=[2, 3, 7, 5, 26, 221, 44, 233, 254, 265, 266, 267, 120, 111],
pypy=[12, 33, 47, 15, 126, 121, 144, 233, 254, 225, 226, 267, 110, 130],
jython=[22, 43, 10, 25, 26, 101, 114, 203, 194, 215, 201, 227, 139, 160],
)
area1 = Area(data, title="Area Chart", legend="top_left",
xlabel='time', ylabel='memory')
area2 = Area(data, title="Stacked Area Chart", legend="top_left",
stack=True, xlabel='time', ylabel='memory')
output_file("area.html", title="area.py example")
show(row(area1, area2))
https://bokeh.pydata.org/en/0.12.5/docs/gallery/area_chart.html 引用
しかし、Bokeh0.13.0では、bokeh.charts.Area
クラスがなくなっていました。
質問
Bokeh 0.13で、「積み上げ面グラフ」用を作成するのには、どのクラスを使えばよろしいでしょうか?
patches
メソッドを使って、「積み上げ面グラフ」を作成しているサンプルはありましたが、自分でstack値を計算していて、Area
より不便です。
もう少し便利なクラスやメソッドがありましたら、教えてください。
import numpy as np
import pandas as pd
from bokeh.plotting import figure, show, output_file
from bokeh.palettes import brewer
N = 20
cats = 10
df = pd.DataFrame(np.random.randint(10, 100, size=(N, cats))).add_prefix('y')
def stacked(df):
df_top = df.cumsum(axis=1)
df_bottom = df_top.shift(axis=1).fillna({'y0': 0})[::-1]
df_stack = pd.concat([df_bottom, df_top], ignore_index=True)
return df_stack
areas = stacked(df)
colors = brewer['Spectral'][areas.shape[1]]
x2 = np.hstack((df.index[::-1], df.index))
p = figure(x_range=(0, N-1), y_range=(0, 800))
p.grid.minor_grid_line_color = '#eeeeee'
p.patches([x2] * areas.shape[1], [areas[c].values for c in areas],
color=colors, alpha=0.8, line_color=None)
output_file('brewer.html', title='brewer.py example')
show(p)
https://bokeh.pydata.org/en/latest/docs/gallery/brewer.html 引用