[matplotlib] 72. マウスカーソルのxの位置に最も近いデータに十字カーソルを合わせる(motion_notify_event)

matplotlib

はじめに

matplotlibのmotion_notify_eventを使って、マウスカーソルのxの位置に最も近いデータに十字カーソルを合わせる方法について説明する。

コード

解説

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

%matplotlibでjupyter lab, notebook内ではなく、別ウインドウで表示する。
Qt5Aggのbackendで表示する。

バージョン

class SnaptoCursorの作成

コンストラクタ

self.lx = ax.axhline(color=’g’)で水平な線を表示し、self.ly = ax.axvline(color=’g’)で垂直な線を表示させる。
ax, x,yをそれぞれself.ax, self.x, self.yとする。

mouse_moveの設定

if not event.inaxes: returnでax内にカーソルがない場合はなにもしないようにする。
event.xdata, event.ydataでカーソルの現在位置を取得する。
np.argmin(np.abs(self.x-x))でカーソルの位置にxについて、最も近いデータのインデックスを求める。

indxの位置のデータをそれぞれx,y とし、self.lx.set_ydata(y)で水平線のデータをyの値でセットし、self.ly.set_xdata(x)で垂直線のデータをxの値でセットする。

self.ax.set_titleでx,yの値をタイトルに表示し、self.ax.figure.canvas.draw()で図を更新する。

図の表示

fig.canvas.mpl_connectで(‘motion_notify_event’)を実行し、snap_cursorのmouse_move内のコードをカーソルを動かすたびに実行させる。

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

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

参考

Cursor Demo — Matplotlib 3.1.3 documentation
[NumPy] 6. データの最大, 最小, 0に最も近い値のindex
np.abs, np.argminを利用して、0に最も近い要素のindexを求める

コメント