【matplotlib】fig.canvas.mpl_connectでon_keyにパラメータを渡す方法
fig.canvas.mpl_connect('key_press_event', on_key) で登録するイベントハンドラ on_key にパラメータを渡したい場合、コールバック関数は自動的に呼び出されるため直接引数を指定できません。そこで、lambda 式や functools.partial を活用します。まずは基本的な実装手順を見ていきましょう。
基本の手順
- 図のサイズを設定し、サブプロット間および周囲の余白(パディング)を調整します。
- figure と一連のサブプロットを作成します。
- 軸の x・y の表示範囲(スケール)を設定します。
- イベントハンドラをイベントにバインド(接続)します。
- show() メソッドで図を表示します。
サンプルコード
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
fig, ax = plt.subplots()
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
def onkey(event):
if event.key.isalpha():
if event.xdata is not None and event.ydata is not None:
ax.plot(event.xdata, event.ydata, 'bo-')
fig.canvas.draw()
cid2 = fig.canvas.mpl_connect('key_press_event', onkey)
plt.show()
出力結果

on_keyにパラメータを渡す方法
実際に独自のパラメータを渡したい場合は、lambda を使って引数を包み込みます。次の例では、描画色を外部から渡せるようにしています。
def onkey(event, ax, color):
if event.key.isalpha():
if event.xdata is not None and event.ydata is not None:
ax.plot(event.xdata, event.ydata, color)
fig.canvas.draw()
# lambda経由でパラメータを渡してバインド
cid2 = fig.canvas.mpl_connect(
'key_press_event',
lambda event: onkey(event, ax, 'bo-')
)
また、標準ライブラリの functools.partial を使っても同様のことが可能です。
from functools import partial
cid2 = fig.canvas.mpl_connect(
'key_press_event',
partial(onkey, ax=ax, color='bo-')
)
コードの解説
このコードでは、キーボードのアルファベットキーが押されるたびに、その時点でのマウスカーソル位置のデータ座標(event.xdata・event.ydata)を取得し、青い点と線で順につないで描画します。カーソルがプロット領域外にある場合は座標が None になるため、そのケースは条件分岐で安全にスキップしています。
-
Matplotlibのバーとウェッジにテクスチャ(ハッチング)を追加する方法
Matplotlibでは、hatchパラメータを指定することで、棒グラフのバーや円グラフのウェッジにテクスチャ(ハッチングパターン)を簡単に追加できます。ハッチングを活用すると、白黒印刷でもデータ系列を区別しやすくなり、グラフに視覚的なアクセントを加えることもできます。 テクスチャを追加する手順 figure()メソッドを使用して、新しい図を作成するか、既存の図をアクティブにします。 サブプロット構成の一部として、図にAxes(軸)を追加します。 ハッチパターンのリストを作成します。バーはこれらのハッチで塗りつぶすことができます。 ハッチの数と同じ数のバーを作成します。 bar()メソッドに
-
Tkinterのイベントハンドラーに引数を渡す方法をわかりやすく解説
Tkinterでは、多くの場合、コールバック関数はインスタンスメソッドとして定義されます。インスタンスメソッドは、明示的な引数を指定しなくても、クラス内のすべてのメンバーにアクセスし、それらを利用して処理を実行できます。しかし、複数のウィジェットが存在し、それぞれに対して個別のイベント処理を行いたいケースもあります。このような場合には、イベントハンドラーに引数を渡すことで、柔軟に複数のイベントを扱うことが可能になります。本記事では、lambda(ラムダ)式を活用してイベントハンドラーに引数を渡す方法を紹介します。実装例次の例では、フレーム内に複数のボタンウィジェットを作成し、クリックされたボタ