はじめに
以前の記事で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アプリを作ってみようと思います。