疲れてしまったのでqiitaへmatlabに関する記事を投稿して徳を積もうと思います。
objective
グラフオブジェクトを操って隠れちゃった線を手前に持ってくる
graphical abstract (Before/After)
what is important
g = get(gca);
とやると、matlabではgにグラフオブジェクトが取得できます。
ここが今日のコツです。
よくわからないと思うのでサンプルコードを示していきます。
sample code
Before の方の図を下記コードから作成。
figure;
range = 0:0.01:2*pi;
hold on;
linewidth = 'LineWidth';
linewidthval = 4; % Line Width
plot(range(1:100), sin(range(1:100)), '-b', linewidth, linewidthval);
plot(range, sin(range), '-r', linewidth, linewidthval);
plot(range, ones(1, length(range)), '-k', linewidth, linewidthval);
青い線が、赤い線の奥に隠れてしまいました。
そこで、グラフオブジェクトを取得して、プロットの順番を変えてセットし直す、ということをします。
てめぇ何言ってんだッて感じだと思うのでまたサンプルコードです。
>> g = get(gca);% グラフオブジェクトを取得。
>> g.Children% g.Childrenには、plot objectとでも呼ぶべきものが詰まっています。
ans =
3x1 Line 配列:
Line (data3)
Line (data2)
Line (data1)
>> set(gca, 'Children', [g.Children(3) g.Children(2) g.Children(1)])% ひっくり返してセットし直す
このコードはgetter/setterでgcaからグラフ情報を引っ張りだしてるんですね。
で、その子要素(ここだとg.Children)のプロットオブジェクトの順番を入れ替えた配列を作って
setterで再度代入すると、プロットの重なる順序が代わるんですね。
わっかりやすぅ~!
で、結果ドン!
無事に青い線が手前に来ました。
reference
下記のも参考にしました。ちゃんちゃん。
% オブジェクトのハンドル番号を検出
h = get(gca,'Children'); % 軸オブジェクトの子オブジェクトを取得(複数の場合はベクトル)
hg = findobj(h,'type','line','Color','b'); % 青色のlineオブジェクトを検出
% オブジェクトの順番の入れ替え
% 青色ラインの要素を取得
ind = (h == hg); % h において hg であるかどうかを論理値で出力
% 青色ラインのハンドルを一番上に設定
newh = [h(ind); h(~ind)]; % h(ind):青色ラインのハンドル、h(~ind):それ以外のハンドル
set(gca,'children',newh) % Childrenプロパティ値の再設定(順番の入れ替え)
via プロット表示されたグラフにおいて、任意のラインを一番上に表示させる方法はありますか? - MATLAB Answers - MATLAB Central
ちなみにこんな記事も書きました。