3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

legendx: グラフ別に凡例を表示する/しない設定を簡単にできるlegendを作った - MATLAB

Last updated at Posted at 2024-06-09

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の判例は表示されません▼
image.png

従来のlegendメソッドでは,一部のグラフのみを凡例として表示したい時,そのコードが煩雑になりがちになっていました.legendxでは,その問題を解決することができます.

legendxを普段使いするには

  1. legendx.mというファイルでlegendxのコードを自分のコンピュータ内の適当な場所に保存します.
  2. MATLABの「コマンド ウィンドウ」にpathtoolと打ちます.
  3. 「フォルダーを追加」を押して,先ほどlegendx.mを保存したフォルダを選択します.
  4. MATLABの「コマンド ウィンドウ」にlegendxと打ってなんか動いてる感じがしたら成功です🎉

従来のlegendの厄介ポイント

次の4本のグラフを表示することを考えます.
image.png

ここで,青と赤のグラフのみに凡例を付けたいとします.こんな感じ▼
image.png

こうするためのMATLABの実装は様々考えられますが,それぞれいくつか問題点があります.

準備:データの準備
X = linspace(1,10);
A = log(X);
B = X;
C = sin(X);
D = 10 * exp(-X+1);

AとBの凡例を表示し,CとDの凡例を表示しないことにします.

最も正統なやり方の1つ目は,次のように判例を表示したいグラフを表すオブジェクトと表示名をlegendに渡すことです.

正統なやり方 - オブジェクトと表示名を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

ですが,この方法は表示するグラフが多くなると管理するのが大変になります.

次に示すのも正統なやり方ですが,やはりグラフが多くなった時の管理が大変です.

正統なやり方 - オブジェクトをlegendに渡す
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

正統なやり方 - 表示名をlegendに渡す
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○○"もしくは空白のまま凡例に出てきやがるのです.
image.png

legendx

そこでlegendxでは,DisplayNameが指定されている・空ではないグラフのみを選び,legendに渡します.

ですので,先ほどの「問題のある書き方」に対してlegendlegendxと置き換えるだけで,所望の動作を実現できます.

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など)も渡せます.

legendx in subplot / with arguments
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

image.png

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?