はじめに
本記事では、matplotlibのmotion_notify_eventを使用して、マウスカーソルのx位置に最も近いデータポイントに十字カーソルを自動的に合わせる方法について解説します。これにより、グラフ上のデータを直感的に探索できるインタラクティブな可視化が実現できます。
コード

解説
モジュールのインポートなど
matplotlibをJupyter LabやNotebook内ではなく、別ウィンドウで表示します。表示にはQt5Aggのバックエンドを使用します。
バージョン
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メソッド内のコードがカーソルを動かすたびに実行されます。

まとめ
本記事では、matplotlibのmotion_notify_eventを活用して、マウスカーソルの位置に最も近いデータポイントに十字カーソルを自動的に合わせる方法を解説しました。この手法を使うことで、データの探索がより直感的になり、ユーザーエクスペリエンスが向上します。イベントハンドリングを活用することで、さらに高度なインタラクティブ可視化も実現可能です。
参考

コメント