python

【python】インタラクティブなグラフ化ライブラリholoviewsの基本的な使い方

はじめに

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
graph_scatter

点の色とマーカー種類の変更

# marker "+"  "^"  "x"  "s" "o"
hv.Scatter((x,y)).opts(width=300, height=250,show_grid=True, color = "red" , size=10, marker="x" )
graph_scatter_color

折れ線グラフ Curve

#折れ線グラフ Curve
graph = hv.Curve((x,y)).opts(width=400, height=250,show_grid=True)
graph
graph_Curve

線の色と種類の変更

#線種 'dotted' 'dotdash' 'solid'
graph = hv.Curve((x,y)).opts(color = "red", line_dash="dotdash").opts(width=500, height=250,show_grid=True)
graph
graph_Curve_color

グラフレイアウト

グラフを同じグラフレイアウトに描画するときは * を使います。例では、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
graph_Curve_multi

グラフを並べて描画するときは + を使います。異なる種類のグラフを並べることができます。例では、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
graph_Multi

ヒストグラム histgram

#ヒストグラム histgram 
g=hv.Scatter((x,y))
histogram(g,bin_range=(-5, 5),bins=30,dimension="y").opts(fill_color = "blue",width=500)
graph_Histgram

箱ひげ図 boxplot

#箱ひげ図 boxplot
boxw = hv.BoxWhisker(np.random.randn(100))
boxw
graph_Boxplot
#並べて表示
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))
graph_Boxplot_multi

水平線、垂直線 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
graph_HlineVline

タイトル、凡例

#タイトル、凡例
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)
graph_TitleLabel

軸ラベル

#軸ラベル
hv.Scatter((x, y),"x_axis","y_axis" )
graph_AxisLabel

そのほか

散布図で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="タイトル")
graph_scatter_color_Z

散布図で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 で設定する
graph_scatter_color_size

-python
-, ,

Copyright© Program as Life , 2020 All Rights Reserved Powered by AFFINGER5.