Abstract
legend
の強化版,legendx
を提案します.legendx
では,凡例に表示させる/させない設定を簡単にできるようになります.
legendx
では,DisplayName
引数を指定したグラフについては凡例が表示され,DisplayName
引数を指定なかったグラフについては凡例が表示されないようになります.具体的には
figure
hold on
plot(X,A,DisplayName="log")
plot(X,B,DisplayName="linear")
plot(X,C)%←特に何も指定しないだけ
plot(X,D)%←特に何も指定しないだけ
legendx
hold off
と打つだけでAとBの凡例は表示され,CとDの判例は表示されません▼
従来のlegend
メソッドでは,一部のグラフのみを凡例として表示したい時,そのコードが煩雑になりがちになっていました.legendx
では,その問題を解決することができます.
legendxを普段使いするには
-
legendx.m
というファイルでlegendxのコードを自分のコンピュータ内の適当な場所に保存します. - MATLABの「コマンド ウィンドウ」に
pathtool
と打ちます. - 「フォルダーを追加」を押して,先ほど
legendx.m
を保存したフォルダを選択します. - MATLABの「コマンド ウィンドウ」に
legendx
と打ってなんか動いてる感じがしたら成功です🎉
従来のlegend
の厄介ポイント
ここで,青と赤のグラフのみに凡例を付けたいとします.こんな感じ▼
こうするためのMATLABの実装は様々考えられますが,それぞれいくつか問題点があります.
X = linspace(1,10);
A = log(X);
B = X;
C = sin(X);
D = 10 * exp(-X+1);
AとBの凡例を表示し,CとDの凡例を表示しないことにします.
最も正統なやり方の1つ目は,次のように判例を表示したいグラフを表すオブジェクトと表示名をlegend
に渡すことです.
figure
hold on
p1 = plot(X,A);
p2 = plot(X,B);
plot(X,C)
plot(X,D)
legend([p1,p2],["log","linear"])
%▲
%🥺グラフオブジェクトを取得していないといけない
%🥺グラフに描いた順番を覚えていないといけない
hold off
ですが,この方法は表示するグラフが多くなると管理するのが大変になります.
次に示すのも正統なやり方ですが,やはりグラフが多くなった時の管理が大変です.
figure
hold on
p1 = plot(X,A,DisplayName="log");
p2 = plot(X,B,DisplayName="linear");
plot(X,C)
plot(X,D)
legend([p1,p2]) %🥺グラフオブジェクトを取得していないといけない
hold off
figure
hold on
plot(X,A);
plot(X,B);
plot(X,C)
plot(X,D)
legend("log","linear") %🥺グラフに描いた順番を覚えていないといけない
hold off
まあこの程度の規模なら正統なやり方でもやれそうではあります.しかし,シミュレーション結果のデータなど,ループしながら何回もグラフを描画する場合などになると,本当に大変になってやってられなくなります.
legend
はかなり厄介です.例えば,次のようにDisplayName
引数だけで何とかすることができません.
figure
hold on
plot(X,A,DisplayName="log")
plot(X,B,DisplayName="linear")
plot(X,C)%😭displays!!
plot(X,D,DisplayName="")%😭displays!!
legend
hold off
▼このように,"data○○"もしくは空白のまま凡例に出てきやがるのです.
legendx
そこでlegendxでは,DisplayName
が指定されている・空ではないグラフのみを選び,legend
に渡します.
ですので,先ほどの「問題のある書き方」に対してlegend
→legendx
と置き換えるだけで,所望の動作を実現できます.
figure
hold on
plot(X,A,DisplayName="log")
plot(X,B,DisplayName="linear")
plot(X,C)
plot(X,D)
legendx
hold off
その他,subplot環境内でもちゃんと動きます.また,varargin
という特殊な引数を使用しているので,legend
で使える引数(FontSize
など)も渡せます.
figure
subplot 211
hold on
plot(X,A,DisplayName="log")
plot(X,B)
legendx
hold off
subplot 212
hold on
plot(X,C)
plot(X,D,DisplayName="exp")
legendx(FontSize=16, Color="yellow")
hold off