Plotly スライダーウィジェット#

※記事内に商品プロモーションを含むことがあります。

公開日

Pythonのインタラクティブなグラフを描画できるライブラリPlotlyにて、スライダーウィジェットを追加する方法を解説します。

Plotlyには、高水準のAPIであるPlotly Expressと呼ばれるものもありますが、この記事では細かい調節ができるgraph_objectsを対象としています。

スライダーの基礎#

Plotlyの棒グラフ go.Bar を3つ用意し、スライダーで切り替える例を示します。 スライダーを右に動かすと、棒グラフの数値が増えます。

import plotly.graph_objects as go

fig = go.Figure(
    data=[
        go.Bar(x=["Alice", "Bob"], y=[1, 2], visible=True),
        go.Bar(x=["Alice", "Bob"], y=[2, 4], visible=False),
        go.Bar(x=["Alice", "Bob"], y=[3, 6], visible=False),
    ],
)

steps = []
for i in range(len(fig.data)):
    step = dict(
        method="update",
        args=[{"visible": [False] * len(fig.data)}],
        label=f"{i}"
    )
    step["args"][0]["visible"][i] = True  # Toggle i'th trace to "visible"
    steps.append(step)

sliders = [dict(
    active=0,
    currentvalue={"prefix": "Year: "},
    pad={"t": 30},
    steps=steps
)]

fig.update_layout(sliders=sliders)
fig.update_yaxes(range=(0, 8))
fig.show()

上記の例を解説します。

まず、スライダーで表示したいグラフ(ここではgo.Bar)をリストでgo.Figuredata属性に定義します。 なお、初期状態で表示したいグラフのみvisible=Trueとして、それ以外のグラフはvisible=Falseとしておきます。

fig = go.Figure(
    data=[
        go.Bar(x=["Alice", "Bob"], y=[1, 2], visible=True),
        go.Bar(x=["Alice", "Bob"], y=[2, 4], visible=False),
        go.Bar(x=["Alice", "Bob"], y=[3, 6], visible=False),
    ],
)

次に、スライダーを動かしたときの挙動を以下のように変数stepsに定義します。 上記の例では、len(fig.data)3となります。

いったん全グラフのvisible属性をFalseにした後、i番目のグラフ(スライダーで指定するグラフ)のみvisible属性をTrueとします。 また、label属性には、スライダーの下部に表示するラベルを指定します(この例では0, 1, 2となる)。

steps = []
for i in range(len(fig.data)):
    step = dict(
        method="update",
        args=[{"visible": [False] * len(fig.data)}],
        label=f"{i}"
    )
    step["args"][0]["visible"][i] = True  # Toggle i'th trace to "visible"
    steps.append(step)

さらに、以下のようにグラフにスライダーを追加します。

sliders = [dict(
    active=0,
    currentvalue={"prefix": "Year: "},
    pad={"t": 30},
    steps=steps
)]

fig.update_layout(sliders=sliders)

sliders変数の辞書の意味は以下の通りです。

  • active: スライダーの初期位置を0始まりの整数で定義

  • currentvalue: スライダーで選択中の値に関する設定を定義

    • prefix: 選択中の値の先頭に付ける文字列を定義

  • pad: スライダーの余白を定義

  • step: スライダーを動かしたときの挙動

スライダーの挙動#

スライダーを動かしたときの挙動に関する設定方法について、もう少し詳しく解説します。

steps = []
for i in range(len(fig.data)):
    step = dict(
        method="update",
        args=[{"visible": [False] * len(fig.data)}],
        label=f"{i}"
    )
    step["args"][0]["visible"][i] = True  # Toggle i'th trace to "visible"
    steps.append(step)

上記のコードのargsには、表示するグラフ以外についても設定できます。 例えば、スライダーの位置に合わせてグラフのタイトルを変更する場合、以下のように書けます。

args=[
    {"visible": [False] * len(fig.data)},
    {"title": f"Alice & Bob's value at Year {i}"},
],

スライダーの表示#

スライダーの表示に関する設定を詳しく解説します。

sliders = [dict(
    active=0,
    currentvalue={"prefix": "Year: "},
    pad={"t": 30},
    steps=steps
)]

このdictには以下の値を設定できます。

  • activebgcolor: スライダーがアクティブな場合の色

  • bgcolor: スライダーの色

  • bordercolor: スライダーの枠線の色

  • borderwidth: スライダーの枠線の太さ

  • currentvalue: 選択中の値に関する設定

    • font: フォントの設定

      • color: 文字色

    • prefix: 選択中の値の先頭に付ける文字列

    • suffix: 選択中の値の後に付ける文字列

  • font: スライダー目盛りのフォント設定

    • color: 文字色

  • len: スライダーの長さ(デフォルト値:1

  • lenmode: スライダーの長さlenを指定するモード。fraction(デフォルト)、pixelsから選択

以下に例を示します。

sliders = [dict(
    active=0,
    bgcolor="red",
    bordercolor="black",
    currentvalue={
        "font": {"color": "green"},
        "prefix": "Year: ",
        "suffix": " (Start: 2025)",
    },
    font={"color": "blue"},
    pad={"t": 30},
    len=0.6,
    steps=steps,
)]

fig.update_layout(sliders=sliders)
fig.show()

参考サイト#