Contents
はじめに
pythonのグラフ化ライブラリholoviewsの基本的な使い方を備忘録としてまとめます。
holoviewsはインタラクティブ(マウス操作でグラフをぐいぐい移動したり拡大縮小したりできる)操作でわかりやすくグラフ化できるオープンソースライブラリです。
コードもシンプルでグラフを複数レイアウトする場合も簡単に実現できます。
公式HPに詳しいインストール方法、使い方、サンプルが載っていますが、この記事では最低限の基本的な使い方を紹介します。
インストール
pipでインストールできます。
pip install holoviews pip install bokeh
モジュールインポート
#モジュールインポート
import holoviews as hv
from holoviews import opts
import bokeh
hv.extension('bokeh', 'matplotlib')
バックエンドのグラフライブラリは3つ使用できますが、基本的に、bokehとmatplotlibで事足りると思います。
グラフ化
データ作成
データの形式はリスト、numpyのndarray、pandasのDataframeなどが使用できます。
#データ作成
import numpy as np
y = np.random.randn(100)
x = np.arange(100)
散布図 Scatter
#散布図 Scatter
graph = hv.Scatter((x,y)).opts(width=300, height=250,show_grid=True)
graph
点の色とマーカー種類の変更
# marker "+" "^" "x" "s" "o"
hv.Scatter((x,y)).opts(width=300, height=250,show_grid=True, color = "red" , size=10, marker="x" )
折れ線グラフ Curve
#折れ線グラフ Curve
graph = hv.Curve((x,y)).opts(width=400, height=250,show_grid=True)
graph
線の色と種類の変更
#線種 'dotted' 'dotdash' 'solid'
graph = hv.Curve((x,y)).opts(color = "red", line_dash="dotdash").opts(width=500, height=250,show_grid=True)
graph
グラフレイアウト
グラフを同じグラフレイアウトに描画するときは * を使います。例では、graph1 * graph2
# グラフレイアウト
y1 = np.random.randn(100)
y2 = np.random.randn(100) + 5
graph1 = hv.Curve((x,y1)).opts(width=400, height=250,show_grid=True)
graph2 = hv.Curve((x,y2)).opts(width=400, height=250,show_grid=True)
graph1 * graph2
グラフを並べて描画するときは + を使います。異なる種類のグラフを並べることができます。例では、graph1 + graph2
#グラフを並べるときは +
graph1 = hv.Scatter((x,y)).opts(width=300, height=250,show_grid=True)
graph2 = hv.Curve((x,y)).opts(width=400, height=250,show_grid=True)
graph1 + graph2
ヒストグラム histgram
#ヒストグラム histgram
g=hv.Scatter((x,y))
histogram(g,bin_range=(-5, 5),bins=30,dimension="y").opts(fill_color = "blue",width=500)
箱ひげ図 boxplot
#箱ひげ図 boxplot
boxw = hv.BoxWhisker(np.random.randn(100))
boxw
#並べて表示
groups = np.concatenate( (np.full(50,'A') , np.full(100,'B') , np.full(50,'C') ))
data=np.concatenate(( np.random.randn(50)*2 , np.random.randn(100) , np.random.randn(50)*0.5 ))
boxwhisker = hv.BoxWhisker((groups, data), 'Group', 'Value').sort()
boxwhisker.opts(
opts.BoxWhisker(box_color='white', height=400, show_legend=True, whisker_color='gray', width=600))
水平線、垂直線 Hline Vline
#水平線、垂直線 Hline Vline
xs = np.random.normal(size=100)
ys = np.random.normal(size=100) * xs
points_g = hv.Points((xs,ys))
hline_g = hv.HLine(ys.mean()).opts(color='red', linewidth=6)
vline_g = hv.VLine(xs.mean()).opts(color='blue', linewidth=6,line_dash="dotdash")
points_g * hline_g * vline_g
タイトル、凡例
#タイトル、凡例
g=hv.Curve((x, y), label="hoge1").opts(width=400, height=250) * hv.Curve((x+2, y), label="hoga2").opts(width=400, height=250)
g.opts(title="タイトル",show_grid=True)
軸ラベル
#軸ラベル
hv.Scatter((x, y),"x_axis","y_axis" )
そのほか
散布図でZ軸データをグラデーションで表したい。
#散布図でZ軸データをグラデーション
y = np.random.randn(100)
x = np.arange(100)
z = np.arange(100) #色
#print("指定可能なカラーマップ")
#print(hv.Palette.colormaps.keys())
hv.Scatter((x, y, z), vdims=['y','z']).opts(color_index="z", cmap='Inferno' , show_grid = True,title="タイトル")
散布図でZ軸データをサイズで表したい。
#散布図でZ軸データをサイズで表現
y = np.random.randn(100)
x = np.arange(100)
z = np.random.random(100)*10 #サイズ
hv.Scatter((x, y, z), vdims=['y','z']).opts(size="z", cmap='Inferno' , show_grid = True,title="タイトル",alpha=0.8)
#透過は alpha で設定する