[matplotlib] 66. マウスイベントで図中の四角をドラッグで動かす 

matplotlib

はじめに

この記事では、matplotlibのマウスイベント機能を使って、図中に配置した四角形をマウスでドラッグして自由に移動させる方法について解説します。Pythonでインタラクティブな可視化を実現するための実践的なテクニックを学べます。

コード

解説

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

Jupyter Labでインタラクティブな操作を行うには、コードの冒頭に「%matplotlib widget」を記述します。Jupyter Notebookの場合は「%matplotlib notebook」を使用します。別ウィンドウで図を表示したい場合は「%matplotlib」を指定します。

バージョン

図の作成

グラデーションの背景表示関数

この関数は下記記事で用いたものを用いました。

[matplotlibで錯視] 14. Combined circle
中央の円の色が変化して見える錯視をmatplotlib FuncAnimationで作成して表示する。

図の表示

図は下記のようになります。図の中央に配置されたグレーの四角形(Rectangle)をマウスでドラッグして移動できるようにします。

Outputの設定

print()を表示するためのOutputをdisplay()で表示しておきます。

class DraggableRectangleの作成

コンストラクタ

マウスイベントへの接続

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

クリック時の動作

self.rect.contains(event)でクリックした位置に四角形があるかどうかを判定します。四角形以外の場所をクリックしても何も起こりません。

self.press = x0, y0, event.xdata, event.ydataで四角形の座標とクリックした位置のデータを保持します。

ドラッグ時の動作

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

クリックした位置とドラッグした位置のデータの差分を計算し、その移動量を四角形のxy座標に適用することで四角形を動かしています。

「self.rect.figure.canvas.draw()」を実行することで、図の再描画を行い変更を反映させています。

リリース時の動作

マウスリリース時にクリック時に取得したデータをリセットします。

ドラッグできる図の表示

下図のようにドラッグで四角を動かすことができます。

jupyter notebookの場合

イベントの切断

dr.disconnect()を使用してイベントを切断することで、四角形がドラッグに反応しなくなります。

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

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

まとめ

matplotlibのマウスイベントを利用することで、図中の四角形をドラッグして自由に動かせるインタラクティブな可視化が実現できます。イベントハンドラーを適切に設定し、press、move、releaseの各イベントを処理することがポイントです。この技術を応用すれば、より直感的で操作性の高いデータビジュアライゼーションを作成することが可能になります。

参考

https://matplotlib.org/users/event_handling.html#draggable-rectangle-exercise
matplotlib.artist.Artist.set_contains — Matplotlib 3.1.2 documentation
[matplotlibで錯視] 14. Combined circle
中央の円の色が変化して見える錯視をmatplotlib FuncAnimationで作成して表示する。

コメント