[matplotlib] 82. マウスイベントで画像上の任意の位置に四角を表示

matplotlib

はじめに

この記事では、matplotlibを使って画像上のマウスイベント(button_press_event、button_release_event、motion_notify_event)を検知し、ユーザーが選択した任意の位置に四角形を表示する方法について解説します。

コード

解説

モジュールのインポートなど

バージョン

データの生成

画像データは下記記事と同じコードにより生成しました。

[matplotlib] 57. imshow使用時に軸を画像から離して表示する方法
matplotlibのplt.imshowで画像表示する際に軸を画像から離して配置する方法を解説します。tick_paramsとspinesの設定で軸の位置を調整し、視認性を高めるテクニックを紹介します。

画像の表示

make_axes_locatableを使用してカラーバーを表示します。.append_axes(“top”)メソッドで画像の上部にカラーバーを配置でき、orientation=’horizontal’パラメータで水平方向のカラーバーを作成しました。

class Set_Rectangleの作成

コンストラクタ

マウスイベントへの接続

button_press_eventはマウスをクリックしたときに発生し、button_release_eventはクリックを離したときに発生します。また、motion_notify_eventはマウスを動かしたときに発生するイベントです。

クリック時の動作

self.press = x0, y0, event.xdata, event.ydataでクリック位置のデータを取得し、self.rect.set_xyで四角形の位置をその点に設定します。また、self.posi.appendを使ってこのデータをリストに保存しておきます。

ドラッグ時の動作

「if self.press is None: return」の条件文で、ドラッグ時のみ処理が有効になるようにしています。

クリックした位置とドラッグした位置のデータの差を計算し、その値を四角形のwidth(幅)とheight(高さ)に設定します。

「self.rect.figure.canvas.draw()」を実行することで、図の再描画を行います。。

リリース時の動作

マウスボタン離し時(リリース時)の位置を、self.posi.appendメソッドを使ってリストに追加します。また、self.press = Noneを実行して、pressの状態をリセットします。

マウスイベントで四角を表示

まず、左下の座標が(0, 0)、幅0、高さ0のRectangleオブジェクトを作成し、ax.add_patch(rects)で図に追加します。その後、dr = Set_Rectangle(rects)とdr.connect()を実行することで、マウスイベントの検知が可能になります。

コードをダウンロード(.pyファイル)

コードをダウンロード(.ipynbファイル)

まとめ

matplotlibのマウスイベント機能を活用することで、画像上の任意の位置に四角形をインタラクティブに表示することができます。このテクニックは画像解析やデータ可視化アプリケーションの開発において非常に有用です。今回学んだbutton_press_event、button_release_event、motion_notify_eventの組み合わせにより、ユーザーフレンドリーなインターフェースを実現できることが分かりました。

参考

https://matplotlib.org/users/event_handling.html#draggable-rectangle-exercise
matplotlib.patches.Rectangle — Matplotlib 3.1.2 documentation

コメント