Plotly ボタンウィジェット#

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

公開日

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

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

ボタンウィジェットの基礎#

Plotlyのヒートマップ go.Heatmap に、カラーマップを切り替えるボタンを追加する例を示します。

import plotly.graph_objects as go

z_data = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
]

fig = go.Figure(
    data=go.Heatmap(z=z_data, colorscale="Viridis")
)

buttons = [
    dict(
        args=["colorscale", "Viridis"],
        label="Viridis",
        method="restyle",
    ),
    dict(
        args=["colorscale", "Jet"],
        label="Jet",
        method="restyle",
    ),
    dict(
        args=["colorscale", "Reds"],
        label="Reds",
        method="restyle",
    ),
]

fig.update_layout(
    updatemenus=[
        dict(
            type="buttons",
            direction="left",
            buttons=buttons,
            pad={"r": 10, "t": 10},
            showactive=True,
            x=0.05,
            xanchor="left",
            y=1.3,
            yanchor="top",
        ),
    ]
)

fig.show()

上記の例を解説します。

まず、各ボタンを以下のように辞書で定義します。

dict(
    args=["colorscale", "Viridis"],
    label="Viridis",
    method="restyle",
),

各キーの意味は以下の通りです。

  • args: ボタンで設定したいパラメータ

  • label: ボタンに表示するラベル名

  • method: "restyle"(データを変更)、"relayout"(レイアウトを変更)、"update"(レイアウトとデータの両方を変更)

次に、fig.update_layout()メソッドのupdatemenus引数でボタンを表示します。

fig.update_layout(
    updatemenus=[
        dict(
            type="buttons",
            direction="left",
            buttons=buttons,
            pad={"r": 10, "t": 10},
            showactive=True,
            x=0.05,
            xanchor="left",
            y=1.3,
            yanchor="top",
        ),
    ]
)

各キーの意味は以下の通りです。

  • type (str): メニューの種類。"buttons", "dropdown"

  • direction (str): ボタンを配置する方向。"left"(横方向)、"top"(縦方向)

  • buttons (list): 各ボタンの定義

  • pad (dict): ボタン周りの空白 (pixel).

  • showactive (bool): Trueの場合、選択したボタンを目立たせる

  • x (float): x方向の位置(0: 左端。1: 右端)

  • y (float): y方向の位置(0: 下端。1: 上端)

また、上記以外にupdatemenusに指定可能なオプションを以下に示します。

  • active (int): 初期状態でアクティブにするボタン(0始まりの整数)

  • bgcolor (str): 非アクティブ状態のボタンの背景色

  • bordercolor (str): ボタンの枠線の色

  • borderwidth (int): ボタンの枠線の太さ(デフォルト値:1

relayoutによるタイトル表示#

続いて、method="relayout"としてレイアウトを変更する例を示します。 ボタンによって、図のタイトルの表示・非表示を切り替えます。

fig = go.Figure()
fig.add_trace(go.Scatter(x=[1, 2, 3], y=[1, 3, 2], name="Series A"))
fig.add_trace(go.Scatter(x=[1, 2, 3], y=[3, 2, 1], name="Series B"))
fig.update_layout(title="Figure Title")

buttons = [
    dict(
        args=["title", "Figure Title"],
        label="Show title",
        method="relayout",
    ),
    dict(
        args=["title",  ""],
        label="Hide title",
        method="relayout",
    ),
]

fig.update_layout(
    updatemenus=[
        dict(
            type="buttons",
            direction="left",
            buttons=buttons,
            pad={"r": 10, "t": 10},
            showactive=True,
            x=0.2,
            xanchor="left",
            y=1.3,
            yanchor="top",
        ),
    ]
)

fig.show()