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

matplotlib

はじめに

matplotlibのマウスイベントを使って、図中にある四角をドラッグで任意の位置に動かす方法について説明する。

コード

解説

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

jupyter labでインタラクティブな操作をするには、冒頭で%matplotlib widgetとする。
jupyter lnotebookの場合は%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で四角のxyとクリックした部分のデータを保持しておく。

ドラッグ時の動作

if self.press is None: returnでドラッグ時のみ有効になるようにしている。
クリックした点とドラッグした点のデータの差をとって、四角のxyにそのシフトをセットすることで四角を動かしている。
self.rect.figure.canvas.draw()することで図の再描写を行う。

リリース時の動作

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

ドラッグできる図の表示

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

jupyter notebookの場合

イベントの切断

dr.disconnect()でイベントを切断して、ドラッグしても動かないようにすることができる。

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

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

参考

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で作成して表示する。

コメント