web-dev-qa-db-ja.com

各反復後に凡例に追加する

走る

loglog(x,y);
legend('First script');

最初のスクリプトから。次に、hold on;。同様の2番目のスクリプトを実行します。 2つのグラフは正しく表示されますが、最初の凡例しか表示されません。さまざまなスクリプトから凡例を増やしたい。

単一のスクリプトから凡例にどのように追加できますか?

これを行う別の可能な方法は、「DisplayName」と呼ばれます。

hold all
for ind=1:3
x=[0:0.1:10];
plot(x, sin(x)+ind, 'DisplayName',['sin + ' num2str(ind)]);
end
legend(gca,'show')

どこからでもどんな軸にもプロットするときにこのプロパティを使用するだけです:)

ダイナミックな伝説のように、さらに多くのことが可能です!

詳細については、これを参照してください: ドキュメント化されていないmatlabからの動的凡例

[〜#〜]編集[〜#〜]

スクリプトを実行するたびに凡例を更新する必要があります。これは、動的な凡例を使用するか、legend( 'off')で実行できます。凡例( 'ショー')

19
Lucius II.

これに対処する最も簡単な方法は、作成時に凡例のハンドルを保存し、別の系列を含む新しい凡例でプロットを更新し、凡例を削除して新しい凡例を作成する準備ができていることです。

_legendStrings = {'First script'};
h_legend = legend(legendStrings{:});
% ... computations, hold on and additional plot on axis
delete(h_legend);
legendStrings{end+1} = 'Second script';
h_legend = legend(legendStrings{:});
% rinse and repeat...
_

通常、テキストボックスなどのグラフィックスオブジェクトでは、ハンドルを介してオブジェクトを再利用します(deleteは使用しないでください)。ただし、凡例をupdate代わりに置き換える場合は、文字列だけでなく、 zrothによって参照されるMathWorksソリューション は実際にこのアプローチに対処しているようです!

deleteの代わりに新規作成する場合、Eugenioのコメントの回答が示唆するように、legend('off'); legend('show');を使用して凡例のオンとオフを切り替えることもできます。

5
chappjc

最も簡単な方法は次のとおりです。

hold all;
p1=plot(1:10,1:10);  
legend(p1,'1');  % in this way plot(x,y) is saved as variable p1 with name '1'   
p2=plot(1:10,11:20); % different data set

legend(p2,'2');  
legend(gca,'off');    
legend('show');

これはいくつかのメソッドの接続であり、非常にシンプルでどこでも使用できます。

2
gajun5

私は同様の問題がありました:最初に3セットの実験データをプロットしてから、関数推定を行うためにパラメーター推定に入り、毎回モデルデータをプロットし、実験データを保持しながら、前回の実行からモデルデータを削除しました。そして、私は伝説にそれを示してほしかった。さまざまな質問からの解決策を組み合わせてそれを行うことができました。

初期コマンド(メインの上部)

close allは、プロットが毎回新しく始まることを保証します

最初のプロット(私のメイン)

plot(points,expdata1,'ro','DisplayName','Experimental, L= 0.1 m'); hold on
plot(points,expdata2,'bo','DisplayName','Experimental, L= 0.2 m'); 
plot(points,expdata3,'go','DisplayName','Experimental, L= 0.3 m');   
legend('-DynamicLegend','Location','Best')
drawnow
h_old=plot(0,250);

drawnowは、プロットをすぐに強制的に描画し、h_oldは、後で使用する単なる「プレースホルダー」です。データの範囲内にあるため、0,250を選択しました(それ以外の場合は、軸を混乱させます)

2番目のプロット(呼び出された関数内)

h(1)=plot(points,modeldata1,'r-','DisplayName','Model Data, L= 0.1 m');
h(2)=plot(points,modeldata2,'b-','DisplayName','Model Data, L= 0.2 m'); 
h(3)=plot(points,modeldata3,'g-','DisplayName','Model Data, L= 0.3 m');
delete(h_old);
h_old = h;
drawnow

削除しますh_oldと私が作成した新しいプロットで上書きします。このようにして、2番目の反復で2番目の反復のプロットがプロットされ、1番目のプロットが削除され、これらの操作の後にプロットを表示します(ここでもdrawnow)。

1
laureapresa
plot(x,y);
legend('y');

hold on;
plot(x,z);
hold off;

% Now add a new item to the legend

h = legend();
newleg = h.String;
newleg{end+1} = 'z';
legend(newleg);
0
TyCoon