【Bokehを学ぶ-第2回】Bokehで複数種類のグラフを描画しよう

Python

皆さん、こんにちは!

この記事はPythonのデータ可視化ライブラリである「Bokehを学ぶシリーズ」の第2回目。

公式ドキュメントのFirst Stepを更に詳しく解説するようなイメージで進めていきます。

朱莉
Bokehを使って、データ分析の結果を多くの人に共有しましょう!!

この記事では、第1回目ということで、Bokehとは何なのか触れつつ、公式ドキュメントのFirst Stepの1つ「Adding and customizing renderers」を解説していきます。

シリーズの別記事を以下にまとめておきます!

【Bokehを学ぶ-第1回】Bokehでインタラクティブな可視化を行おう! 折れ線グラフの描画

複数のグラフを織り交ぜる(折れ線グラフとバブルチャート)

前回の記事とほとんど同じコードを用います。

変更する必要があるのは、p.lineの行です。

これまではline()と折れ線グラフを書いていましたが、こちらを今回はバブルチャート(circle)を使います。

from bokeh.plotting import figure, show

# サンプルデータを作成
# x,yをそれぞれリスト形式
x = [1, 2, 3, 4, 5]
y1 = [6, 7, 2, 4, 5]
y2 = [2, 3, 4, 5, 6]
y3 = [4, 5, 5, 7, 2]
# バブルチャート用のサイズをリストで保持
size = [1, 2, 3, 4, 5]

# 新しいプロットの作成
# タイトル、軸ラベルを決定し、figureインスタンスを立ち上げる
p = figure(title="Multiple glyphs example", x_axis_label="x", y_axis_label="y")

# add multiple renderers
p.line(x, y1, legend_label="Temp.", color="blue", line_width=2)
p.line(x, y2, legend_label="Rate", color="red", line_width=2)
# バブルチャートを作成する
p.circle(x, y3, size = size, legend_label="Objects", color="black")

# 結果を描画する
show(p)

表示はこんな感じ。

折れ線の1つが、バブルチャートになっていることがわかるかと思います。

※バブルチャートと散布図の違い※
散布図はX座標とY座標の2軸なのに対し、バブルチャートはZ軸をオブジェクトの大きさで表すことのできる3軸のグラフです。
Bokehは、Circle(バブルチャート)と、Scatter(散布図)で異なるので注意が必要です。

Scatterのドキュメントは以下で
https://docs.bokeh.org/en/latest/docs/reference/models/glyphs/scatter.html
Circleのドキュメントは以下です。
https://docs.bokeh.org/en/latest/docs/reference/models/glyphs/circle.html?highlight=circle#bokeh.models.Circle

複数のグラフを織り交ぜる(折れ線グラフと散布図と棒グラフ)

更にグラフを複雑にしていきます。

今度は、バブルチャートではなく、散布図です。

散布図の場合、各オブジェクトの大きさは固定となります。

from bokeh.plotting import figure, show

# サンプルデータを作成
# x,yをそれぞれリスト形式
x = [1, 2, 3, 4, 5]
y1 = [6, 7, 2, 4, 5]
y2 = [2, 3, 4, 5, 6]
y3 = [4, 5, 5, 7, 2]

# 新しいプロットの作成
# タイトル、軸ラベルを決定し、figureインスタンスを立ち上げる
p = figure(title="Multiple glyphs example", x_axis_label="x", y_axis_label="y")

p.line(x, y1, legend_label="Temp.", color="blue", line_width=2)
p.vbar(x=x, top=y2, legend_label="Rate", width=0.5, bottom=0, color="red")
# オブジェクトが円の散布図を作成する
p.scatter(x, y3, legend_label="Objects", color="green", size=12)

# 結果を描画する
show(p)

グラフ要素(glyphs)のカスタマイズ

新規にグラフ要素(glyphs)を作成する場合

各グラフ要素で設定できる項目はすべて公式ドキュメントに記載されています。

以下ではCircle要素で設定できる項目を列挙しておきます。

Bokeh 2.4.3-Circle

from bokeh.plotting import figure, show

# サンプルデータを作成
# x,yをそれぞれリスト形式
x = [1, 2, 3, 4, 5]
y = [4, 5, 5, 7, 2]

# 新しいプロットの作成
# タイトル、軸ラベルを決定し、figureインスタンスを立ち上げる
p = figure(title="Glyphs properties example", x_axis_label="x", y_axis_label="y")

# add circle renderer with additional arguments
p.circle(
    x,
    y,
    legend_label="Objects", # ラベル名
    fill_color="red", # 塗りつぶしの色
    fill_alpha=0.5, # 透明度
    line_color="blue", # 枠線の色
    size=80, # オブジェクトのサイズ
)

# 結果を描画する
show(p)

描画の細かい設定などは、Googleで検索しても出てこないことが多いです。

基本は公式ドキュメントを参照し、

後からグラフ要素(glyphs)を編集する

from bokeh.plotting import figure, show

# サンプルデータを作成
# x,yをそれぞれリスト形式
x = [1, 2, 3, 4, 5]
y = [4, 5, 5, 7, 2]

# 新しいプロットの作成
# タイトル、軸ラベルを決定し、figureインスタンスを立ち上げる
p = figure(title="Glyphs properties example", x_axis_label="x", y_axis_label="y")

# circleのglyphs要素を定義
p.circle(
    x,
    y,
    legend_label="Objects", # ラベル名
    fill_color="red", # 塗りつぶしの色
    fill_alpha=0.5, # 透明度
    line_color="blue", # 枠線の色
    size=80, # オブジェクトのサイズ
)

# グラフ要素を後から変更する
glyph = circle.glyph # circleのグラフ要素をインスタンス化
glyph.fill_color = "blue" # インスタンス化したグラフ要素の fill_color を上書きする

# 結果を描画する
show(p)

まとめ

「Bokehを学ぶシリーズ」第2回はいかがでしたでしょうか。

まずはBokehで様々なグラフを描画できることをご理解いただけたのではないでしょうか!

経った数行でイイ感じのグラフを書くことが出来るBokehをマスターできれば、簡単に社内共有用のデータダッシュボードを作成することができそうです。

朱莉
このシリーズを通じて、データ可視化をより効率的に行えるようになれば嬉しいです!