morikomorou’s blog

自分が学んだことなどの備忘録的なやつ

【python】matplotlibでボタンを作成する方法


はじめに

以前の記事でmatplotlibでクリックイベント等の実装を行い、matplotlibのみでGUIアプリみたいなものを作ったりしていました。

今回もいろいろ調べていたところ、ボタン等も配置できるようです。
簡単に使い方を説明します。




ボタンの配置

ボタンの作成はmatplotlib.widgets.Buttonを使用します。
引数にはボタンを表示するaxes、ボタンのラベルテキストが必要です。
実際に配置してみましょう。
配置する際はボタン用のsubplotを作成し、そこをボタンとして割り当てるようにして使用します。

# モジュールのインポート
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.widgets as wg

# プロット
fig, ax = plt.subplots(2, 1, gridspec_kw=dict(width_ratios=[1], height_ratios=[8, 1]))
line, = ax[0].plot(np.random.randint(0, 10, 21))
ax[0].set_xlim([0, 20])
ax[0].set_ylim([0, 10])
btn = wg.Button(ax[1], 'Random', color='#f8e58c', hovercolor='#38b48b')
plt.show()

実行結果は以下です。

まだ何もイベントの紐づけを行っていないので、ボタンをクリックしても何も起きません。

ボタンの配置ですが、subplotsのキーワード引数としてgridspec_kwを指定し、subplot間の幅、高さの比率を指定しています。
今回はボタンとグラフで高さの比率が1:8となるように設定しました

colorとhovercolorのキーワード引数を指定することでボタンの背景色とホバー時の背景色を設定できます。

ボタンにクリックイベントを紐づける

matplotlib.widgets.Buttonクラスにはon_clickedメソッドが実装されており、on_clickedメソッドの引数に、クリック時に実行したい関数を入れることでボタンと、クリック時のイベントを紐づけることができます。
今回は、クリック時に折れ線データの値をランダムに更新する関数を紐づけてみます。

# モジュールのインポート
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.widgets as wg


def btn_click(event):
    line.set_ydata(np.random.randint(0, 10, 21))
    plt.draw()


fig, ax = plt.subplots(2, 1, gridspec_kw=dict(width_ratios=[1], height_ratios=[8, 1]))
line, = ax[0].plot(np.random.randint(0, 10, 21))
ax[0].set_xlim([0, 20])
ax[0].set_ylim([0, 10])
btn = wg.Button(ax[1], 'Random', color='#f8e58c', hovercolor='#38b48b')
btn.on_clicked(btn_click)
plt.show()

実行結果は以下です。

今回は、クリック時に呼ばれる関数としてbtn_click()を定義しました。
定義の際は引数にeventを受け取る変数を用意しておかないとエラーになりますので注意が必要です。

おわりに

matplotlib.widgetにはボタン以外にもスライダーやチェックボタン、カーソル等様々なGUI widgetが実装されていますので確認してみてください。

この機能も使って次回はmatplotlibだけでちょっとしたGUIアプリを作ってみようと思います。