グラフのデータヒントが別オブジェクトのせいで、表示されないときの対処方法

matlab のFigure内で散布図の他にエリア(下の図のピンクのエリアのこと)の表示などをしていると、エリア内の点にマウスカーソルをあてても、データヒントが表示されないことがある。

例えば、下のようにscatterとAreaを同じグラフで表示させてみる。

% sinカーブを定義
x= [0:0.1:2*pi];
f = figure(1);
% 散布図を描画
scatter(x,y,'filled',"O")
hold on;
% エリア描画
area([0 3],[1 1],'FaceColor','red','FaceAlpha',0.2,'LineStyle','none');

結果のグラフが下。

表示させた点にカーソルをあてても、表示が重なっている箇所はデータヒントが表示されなくなる。

エリア外、カーソルで選択して、データヒントを表示している。これは問題なし。
エリア内の点をつかむと、点の座標ではなく、
エリアの頂点座標が表示されて、点の情報がみれなくなる。

こういう場合は、axesにぶら下がっているグラフィックオブジェクトの配列の順番をかえると表示されるようになる。

グラフィックオブジェクトの配列って何?

axes上に表示されるグラフの種類のことで、たとえば、hold onした状態でグラフを追加していき、axesの子オブジェクトの中身(下のサンプルコードでax.Children)を表示させると

% sinカーブを定義
x=[0:0.1:2*pi];
f = figure(1);
% 散布図を描画
scatter(x,y,'filled',"O")

ax = f.CurrentAxes
hold on;
% エリア描画
area(ax,[0 3],[1 1],'FaceColor','red','FaceAlpha',0.2,'LineStyle','none');

plot(ax,x,-y);
bar(ax,x,-0.5*y);

ax.Children

赤枠内のように、graphics配列というものが定義されている。これは要素番号が小さいほうが優先順位が高く、グラフ上では、スクリーンの前面に表示されるよう。Area内の点のデータヒントが表示されない理由は、AreaがScatterより前にきているため。

なので、配列内の3番目の要素Areaと4番目Scatterの順序を入れ替えればよさそう。直接配列を編集してもこのサンプルでは、問題なかったが、set関数を使用して、axesのプロパティを編集したほうがよい。

% set関数で子オブジェクトの3番目の要素と4番目を入れ替える 
set(ax,'Children',[ax.Children(1);ax.Children(2);ax.Children(4);ax.Children(3)]);

結果が、上になる。無事にArea内で点をつかんでも、データヒントが表示されるようになった。少し見づらいがグラフィックオブジェクトの配列も上と下でAreaの位置が変わっていることがわかる。

各グラフの表示の順番などもこれで自由に変更できて、見せたいグラフを最前面にもってくるみたいな視覚的なカスタマイズができるようになった。

まとめ

・データヒントは、グラフ同士の優先順位が高いものが優先して表示される。

・グラフの優先順位は、グラフィック配列の順番できまる

・優先順位を変更するには、Set関数を使用して、配列を入れ替えればいい