なぜHoloviews?
- このブログに登場するグラフは、ほぼ全てHoloviewsを使っています。(正確には、PyViz-HoloVizファミリーのholoviews、geoviews、hvplot、Panel)
- Holoviewsは、Bokeh、matplotlib等のラッパーです。
- 最大のメリットはwebベースのインタラクティブなグラフが簡単につくれること。
- 過去記事よりサンプル
ミャンマー某河川の河口部:ETOPO1 + geoviews - 趣味で計算流砂水理 Computational Sediment Hydraulics for Fun Learning
- pythonといえばmatplotlibですが、紙ベースの静的なグラフのためwebベースを有効活用できない。情報量が少ない。
- 紙ベースやめましょう。プリントアウトとかヤバすぎます。
コーディング:matplotlibとの比較
単純な折れ線グラフをHoloviewsで書いてみます。比較のため、matplotlib版も書いておきます。 コードはjupyter上で書いています。なお、グラフはGitHubからGitHub Pagesを表示してiframeで取り込んでいます。
Holoviews
import holoviews as hv hv.extension('bokeh') g = hv.Curve([1,2,4],label='line1').options(width=400,height=300) * hv.Curve([1,4,8],label='line2') g
matplotlib
%matplotlib inline import matplotlib.pyplot as plt fig, ax = plt.subplots(figsize=(4.0, 3.0)) ax.plot([1,2,4],label='line1') ax.plot([1,4,8],label='line2') ax.legend()
- コード量はほとんど同じくらいですね。個人的にはHoloviewsのほうが慣れているから見やすいです。
- Holoviewsでは、*はOverlay:重ね合わせ、+はLayout:並べる、です。
どうしても静的なグラフを書きたい場合
個人的には静的なグラフなんていらないと思いますが、 いざ論文とかにまとめようと思うと静的なベクターのグラフを必要だったりします。(近い将来には変わると思いますが)
前述のとおり、Holoviewsはmatplotlibのラッパーでもあるのでバックエンドを切り替えるだけで簡単に静的なベクターのグラフを作ることができます。
import holoviews as hv hv.extension('matplotlib') g = hv.Curve([1,2,4],label='line1').options(aspect=1.333, fig_size=150) * hv.Curve([1,4,8],label='line2') hv.save(g,'holoviews.svg') g
縦横比の設定方法が、bokehとmatplotlibで異なるのでちょっと面倒ですが、if文とか書いておけば良いと思います。
まとめ
- Holoviewsは、matplotlibとほぼ同じコード量で動的なグラフが作成できる。
- Holoviewsが本領を発揮するのは大容量、多次元の図化。興味がある方は過去記事を。
- pythonによる可視化はHoloviews一択
- jupyterはこちら Jupyter Notebook Viewer
参考図書
リンク