LoginSignup
10
7

More than 5 years have passed since last update.

holoviewsでグラフを作成するときのTIPS

Last updated at Posted at 2018-07-05

事前準備

モジュールインポート

import holoviews as hv
import bokeh
hv.extension('bokeh')

データ作成

import numpy as np

y = np.random.randn(10)
x = np.arange(10)

グラフ

散布図

hv.Scatter((x,y))

折れ線グラフ

hv.Curve((x,y))
  • 積み上げ

    • hv.Area.stackに相当するメソッドが見当たらない
    • 描画前にデータを加工して対応
    hv.Overlay([ hv.Curve((x,y)),  hv.Curve((x ,y + y))])
    

面グラフ

hv.Area((x,y))
  • 積み上げ

    ov = hv.Overlay([ hv.Area((x,y)),  hv.Area((x,y))])
    hv.Area.stack(ov)
    

スプレッドグラフ

  • 日本語で正しくは何グラフというのか不明。
# 全要素同じ幅の場合はint           
hv.Spread((x, 2 * x + 3 , 5 ) )  

bokeh_plot (4).png

# 要素ごと幅が変わる場合はxと同じ要素数の配列
hv.Spread((x, 2 * x + 3 , np.random.randn(len(x)) * 5 ) ) 

bokeh_plot (5).png

# Curveとオーバレイする場合
hv.Curve((x, 2 * x + 3 )) * hv.Spread((x, 2 * x + 3 , 5 )).options(alpha=0.3,line_alpha=0) 

bokeh_plot.png

画像

hv.Image(np.meshgrid(x,x))

ヒートマップ

  • データ構造

    • こんな感じの2次元配列を第一引数に渡す
    y y
    a a 1
    a b 2
    b a 3
    b b 4
    data = [
    ['a','a',1],
    ['a','b',2],
    ['b','a',3],
    ['b','b',4],    
    ]
    hv.HeatMap(data)
    

bokeh_plot (1).png

レイアウト

並べて表示

hv.Layout([ hv.Curve((x,y)),  hv.Scatter((x, y))])
hv.Curve((x,y)) + hv.Scatter((x, y))
  • パネルの行ごとの列数指定
hv.Layout([ hv.Curve((x,y)),  hv.Scatter((x, y)), \
                              hv.Area((x, y))]).cols(2)

image.png

重ねて表示

hv.Overlay([ hv.Curve((x,y)),  hv.Scatter((x, y))])
hv.Curve((x,y)) * hv.Scatter((x, y))

オプション

凡例

hv.Scatter((x, y), label="hoge") * hv.Scatter((x + 2, y),  label="huga")
  • 要素が一つの場合はグラフのタイトルとして表示される

  • タイトル指定
hv.Scatter((x, y),"x_axis","y_axis" )
- グラフを重ねた場合最初に指定した値が有効となる
hv.Scatter((x, y),"x_axis","y_axis" ) * hv.Scatter((x + 2, y),"x_axis + 2","y_axis" )
  • 範囲指定
hv.Scatter((x,y)).redim(x={'range':(10,20)}, y={'range':(-1,1)})
  • フォーマット指定

    • 事前準備
    pip install flexx
    
    • 処理
    def fmt (x):
        return "%d" % ("hoge" + x )
    # 下記ではエラーとなった
    # fmt = lambda x : "%d" % ("hoge" + x )
    hv.Curve((x,y), vdims=hv.Dimension('y', value_format=fmt))
    
    - format()関数では動作しなかったり動作しないフォーマット文字列がある。
    - 指数表示を整数に修正する程度の役には立つ
    - flexxの仕様によるものではないかと推測
    
  • 非表示化

    • 画像だけ表示したいときに軸と軸のタイトルを非表示化
    hv.Image(np.meshgrid(x,x)).options(xticks=False,     yticks=False, xaxis=None, yaxis=None)
    

色の指定

  • グラフごとの指定
hv.Scatter((x, y)).options(color="blue")
hv.Scatter((x, y)).options(color="#123456")
  • まとめて指定
g = hv.Scatter((x, y)) * hv.Scatter((x + 1, y))
g.options({'Scatter':{'color':hv.Cycle(["yellow","green"] ) }} )
  • 点ごとに指定

    • matplotlibでないと動作しなかった
    import random
    hv.extension('matplotlib')
    colors = [ random.sample(["red","blue"], 1) for x in range(10) ]
    hv.Scatter((x, y)).options(color=colors)
    
    • bokehの場合の回避策

     色指定用の要素をデータに追加し要素ごとにプロット

    import pandas as pd 
    import random 
    c = [random.choice([ 0,1]) for x in range(50) ]
    data = np.array([x,y,c]).T
    df = pd.DataFrame(data, columns=['x','y','c'])
    ds = hv.Dataset((df))
    ds.to(hv.Scatter,vdims=['y'],kdims=['x']).overlay('c')
    
  • 軸を指定
    デフォルトのカラーマップが選択されるよう。

hv.Scatter((x, y)).options(color_index='y')
  • カラーマップ
hv.Scatter((x, y)).options(color_index='y', cmap='RdBu')
  • 指定可能なカラーマップ

    hv.Palette.colormaps.keys()
    

コンテナ

 ホロマップ

  • 第一引数のディクショナリのキーが、スライドバーの選択項目になる。
data = {
    1: hv.Curve((x,y * 1 )),
    2: hv.Curve((x,y * 2 )),
    3: hv.Curve((x,y * 2 ))
}
hv.HoloMap(data, kdim=["data"])
  • 下記のように後から代入することもできる。
holomap = hv.HoloMap(kdim=["data"])
for i in [1, 2, 3]:
    holomap[i] = hv.Curve((x, y * i))
holomap

グリッドコンテナ

10
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7