これからはPandas-Bokehを使おうぜ

Python
スポンサーリンク

最近PandasのDataFrameを頑張って動的に操作するためにBokehを直に触っている記事とかを見つけたので、それぐらいならPandas-Bokehで一発だぜということを知ってほしくて記事にしました。もちろん、私もPandas-Bokehを使い出すまではそういう作業でオレオレ描画ライブラリとか書いていました。

レポジトリ

インストール

pip install pandas-bokeh

使い方

最初にpandas_bokehの読み込みコマンドを実行します。今回はjupyter notebook上で使いたいので、ouutput_notebook としました。

import pandas_bokeh
pandas_bokeh.output_notebook()

plotをplot_bokehに変えるだけ

Pandasをよく使っている人は、DataFrame.plot.bar()でチャートを書くことができることは知っていると思います。Pandas-Bokehの良いところは、そのplotplot_bokehに変えるだけでmatplotlibで描画していたチャートをbokehの動的なチャートに変えることができます。

例えば、ラインチャート書きたければ、これだけで完結します。

# コメントアウトしているのはmatplotlib使用時のコード
import pandas as pd
import numpy as np
#import matplotlib.pyplot as plt
#import seaborn as sns
#%matplotlib inline

sns.set(style='darkgrid', rc={'figure.facecolor':'white'})

df = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))
#df.plot.line()
df.plot_bokeh.line()

コードの違いとしては、見て分かるとおりplotplot_bokehにしているだけですね。

Matplotlibのラインチャートの描画

Pandas-Bokehのラインチャートの描画

これだけで描画にはこれだけの違いが出ます。描画するチャートを選定できたり、凡例を表示できたり、ズームしたりと痒いところに手が届くチャートになっています。X軸のメモリが細かすぎて見えないときでもズームしたら簡単に値を確認できるのも良いところ。

ぜひ、一度試してみてください。もうPandas-Bokehから離れられなくなりますよ。コツとしては、描画に必要なデータだけを確保したDataFrameを用意して、それからplot_bokehを呼んでやるという流れを使うことです。

groupby の例

Pandas-Bokehなのですが、まだ公開が2018年12月とかなり若いライブラリのため、基本的なところでエラーが出たりと動かないことがあります。その例が、groupbyを使った際に index 関連のエラーが出てしまうことなのですが、indexをstr型に置き換えてしまえば描画上は問題なく動きます。

x = np.arange(0, 100, 0.1)
df = pd.DataFrame(x)
result = df.groupby(pd.cut(df[0], np.arange(0, 100, 10))).sum()
result.index = result.index.astype(str)
result.plot_bokeh.bar()

Bokehのラッパーライブラリについて。

ここからは余談です。

Chartify

Bokehのライブラリで最近話題になったspotifyのbokehのラッパーでchartifyというのがあり、これが今回紹介したPandas-Bokehみたいな機能を実装しているはずだと期待していました。しかし、内容は「静的なチャート」に特化したライブラリと明記されていました。なんじゃそれ。Matplotlibでいいやんというのが個人的な感想。

コメント

  1. Piro より:

    Holoviewsが最近plotly対応したみたいなのですが、holoviewsはダメですかね…?
    書きにくい、ですかね?

  2. Kirin Fx-Kirin より:

    >piro
    pandas の標準の方法でBokehでプロットできるという利点とはまた違ってるので、なんともですねー。HoloviewsはRのggplot2を意識して作られてるはずなんです。

タイトルとURLをコピーしました