趣味で計算流砂水理

Computational Sediment Hydraulics for Fun

pythonによる可視化はHoloviews一択

なぜHoloviews

 - 過去記事よりサンプル

はてブロにインタラクティブなグラフを埋め込む:外部htmlのとりこみ CDNとかiframeとか - 趣味で計算流砂水理

ミャンマー某河川の河口部:ETOPO1 + geoviews - 趣味で計算流砂水理

  • 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