Matplotlibでマウスクリックイベントの座標を取得・保存する方法
Matplotlibでマウスクリック時の座標を記録したい場合は、「button_press_event」イベントを利用するのが最も簡単な方法です。この記事では、実際に動作するサンプルコードとともに、その手順をわかりやすく解説します。
実装の手順
- 図(figure)のサイズを設定し、サブプロット間および周囲の余白を調整します。
- 図とサブプロットを作成します。
- 0〜9の範囲で折れ線グラフを描画します。
onclick関数をbutton_press_eventイベントにバインドします。- イベントから取得した x 座標と y 座標を出力します。
show()メソッドで図を表示します。
サンプルコード
from matplotlib import pyplot as plt
plt.rcParams['backend'] = 'TkAgg'
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
# マウスクリックイベントの座標を出力する関数
def onclick(event):
print([event.xdata, event.ydata])
# 図とサブプロットを作成
fig, ax = plt.subplots()
# 0〜9の範囲で折れ線グラフを描画
ax.plot(range(10))
# button_press_event を onclick() にバインド
fig.canvas.mpl_connect('button_press_event', onclick)
# プロットを表示
plt.show()
実行結果
スクリプトを実行すると、まず次のようなグラフが表示されます。

この状態でグラフ上の任意の場所をクリックすると、クリックした地点の座標がコンソールに出力されます。
[6.277811659536052 6.218189947945731] [4.9416949672083685 3.7079096112932475] [8.221254287227506 3.4145010811941963]
応用:座標をリストに保存して後から利用する
クリックした座標を単に表示するだけでなく、あとで解析や処理に使いたい場合は、リストに蓄積しておくと便利です。以下のように onclick 関数内でリストに追加できます。
clicked_points = []
def onclick(event):
# グラフ領域外のクリックでは xdata / ydata が None になるため除外
if event.xdata is not None and event.ydata is not None:
clicked_points.append((event.xdata, event.ydata))
print(f"クリック座標: ({event.xdata:.3f}, {event.ydata:.3f})")
注意点
- グラフの軸領域の外側をクリックした場合、
event.xdataおよびevent.ydataはNoneになります。保存前に必ずNoneチェックを行いましょう。 - バックエンドによってはマウスイベントが正しく動作しない場合があるため、
TkAggなどインタラクティブなバックエンドを指定することをおすすめします。 - 右クリックやダブルクリックなど、ボタンの種類で処理を分けたい場合は
event.buttonの値を確認してください。
このように、mpl_connect を使えば数行のコードでマウス操作によるインタラクティブなデータ取得が実現できます。データポイントの手動選択やアノテーション作業など、さまざまな場面で活用できるので、ぜひ試してみてください。
-
Matplotlibで凡例を行ごとに2列に整列させる方法
Matplotlibの凡例(legend)を2列に整列させて表示したい場合、ncolパラメータを使うことで簡単に実現できます。以下の手順で説明します。手順図(figure)のサイズを設定し、サブプロット周辺の余白(パディング)を調整します。plot()メソッドを使用して、line1、line2、line3というラベルを持つ線を描画します。ncol=2を指定してlegend()メソッドを呼び出し、2列構成の凡例を図上に配置します。show()メソッドで図を表示します。コード例from matplotlib import pyplot as plt plt.rcParams[figure.figs
-
NumPyとMatplotlibで画像セグメンテーションをオーバーレイ表示する方法
NumPyとMatplotlibを組み合わせると、画像セグメンテーションの結果を元画像の上に重ねて(オーバーレイ)表示できます。マスク配列を活用すれば、検出した領域だけを色付きで半透明に強調することが可能です。 実装の手順 10×10のサイズを持つマスク配列を作成します。 一部の領域(中央部分)の値を1に更新します。 NumPyを使って画像データを生成します。 条件を満たす要素をマスクし、マスク済みデータを作成します。 figure()メソッドで新しい図を作成、または既存の図をアクティブ化します。 imshow()メソッドでデータを2次元ラスタ画像として表示します。 show()メソッドで図