MATLABでプロットの点をクリックして関数を呼び出す(コールバック)

 MATLABでデータをプロットした後に、プロットした点をクリックするとその点の情報を持った関数が呼び出せる仕組みがつい先日あり、色々調べていて解決できたのでこちらの記事で共有する。

コールバックとは

 ご存知の方も多いと思うが、MATLABにはコールバックという便利な仕組みがある。コールバックはfigureなどに設定することができ、キー入力やマウス操作に応じて呼び出される関数、もしくは指定した関数を呼び出すことである。コールバックを使うことで、タイトルに書いてある「プロットした点をクリックして関数を呼び出す」ことができる。今回はサンプルプログラムとして、プロットした点をクリックするとその点のxy座標の情報を出力する、という処理を実行するコールバックを実装する。

プロットにコールバックを設定する

 「プロットした点をクリックするとxy座標を出力する」という処理は一見すると単純であるが、まず前提条件を決める必要がある。プロットはどの関数(plot, scatter, errorbar…)を使うのか、プロットはマーカーのみが表示されているのかラインも表示されているのか、などなど。今回は単純にplot関数を使用して説明するが、時間があればscatterにおけるコールバックも説明したい。

LineプロパティのButtonDownFcnにコールバック関数を指定

 plot関数は返り値としてLineオブジェクトを返す。plot関数にそもそも返り値があることを知らない人もいると思う。Lineオブジェクトには様々なプロパティがあり、プロットの色や線の種類、マーカーの種類をプロットした後に変えることができる。

p = plot([1 2 3], [1 2 3]);
p.Color = "red"; # プロットの色を赤に

 実はこのLineオブジェクトのプロパティにButtonDownFcnというコールバックを指定するプロパティがある。ButtonDownとあるがなにかキーボードの入力に反応するわけではなく、マウスのクリックに応じてコールバックが呼び出される。つまり、ButtonDownFcnになにか関数を指定することで、プロットした線や点をクリックすると指定した関数を実行することができる。一般的に、Lineオブジェクトのコールバック関数は以下のように定義する。

function callbackFcn(src, event)
    src.Color = "red"; # srcは元のLineオブジェクト
    event.IntersectionPoint # eventは点の座標などを持っているオブジェクト
end

 コードにある通り、基本は引数を2つ取る関数をLineオブジェクトのコールバックとして指定する。1つ目の引数(src)はコールバックを指定したLineオブジェクトそのものである。そのためコールバックの中でプロットの見た目を変えることが可能である。2つ目の引数(event)はクリックした点の座標などを持つオブジェクトであるので、今回は2つ目の引数のみ使う。event.IntersectionPointはクリックした点の座標が返ってくるので、「プロットした点をクリックするとxy座標を出力する」はこの時点で簡単に達成することができる。

a = -pi:0.1:pi;
b = sin(a);
p = plot(a,b,'-o');
p.ButtonDownFcn = @callbackFcn;

function callbackFcn(~, event)
    coordinates = event.IntersectionPoint;
    coordinates
end

 表示されるプロットは線とマーカーどちらも出てくるが、マーカー内をクリックすればマーカーの座標が、線の上ではクリックした座標が出力される。マーカーも線上にあるから同じじゃないかと思われるかもしれないが、本来は点である座標をマーカーは円という面積があるもので表示しているため、ある程度雑にクリックしてもマーカー内ならその点の座標が返ってくる。線は限りなく細かい値で刻まれているため、自分の狙った値を取り出すのは難しい。何はともあれ、これで目標は達成できた。

 じつはLineだけではなく、figureにもコールバックを設定することができるのだが、時間があるときにでも別記事で解説したい。

コメント

タイトルとURLをコピーしました