每次迭代后添加到图例

时间:2013-10-17 04:52:32

标签: matlab legend

我跑

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

来自第一个脚本。 然后,hold on;。 我运行类似的第二个脚本。 我正确地看到了两张图,但只看到了最初的图例。 我想从不同的脚本中增加图例。

如何从单个脚本添加到图例?

5 个答案:

答案 0 :(得分:18)

另一种可能的方法是将其称为'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')

从任何地方到任何轴绘图时都可以使用此属性:)

还有更多可能的东西,比如动态传奇!

有关详细信息,请参阅:dynamic legend from undocumented matlab

修改

每次运行脚本后都必须更新图例。您可以使用动态图例或仅通过图例('关闭')执行此操作;图例( '节目')

答案 1 :(得分:5)

处理此问题的最简单方法是在创建图例时保存图例的句柄,然后您可以使用包含其他系列的新图例更新图表,删除图例并创建一个新图例:

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)。但是,如果您更新图例而不是替换,那么您不仅要担心字符串。 MathWorks solution referenced by zroth实际上似乎解决了这种方法!

作为delete的替代方案并创建新内容,您还可以使用legend('off'); legend('show');打开和关闭图例作为Eugenio评论中的答案。

答案 2 :(得分:2)

最简单的方法是:

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');

这是几种方法的联系,非常简单,可以在任何地方使用。

答案 3 :(得分:1)

我遇到了类似的问题:我首先绘制了三组实验数据,然后进入我的参数估计模拟函数,并希望每次都绘制模型数据,保留实验数据但删除模型数据上一次运行。我希望传说能够表明这一点。我能够通过不同问题的解决方案组合来实现这一目标。

初始命令(我的主要职位)

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,因为它在数据范围内(否则会弄乱轴)

第二个图(在被调用的函数中)

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并用我创建的新图表覆盖它。这样,在第二次迭代中,将绘制第二次迭代的绘图,将删除第一次的绘图,并且在这些操作之后,我将其显示绘图(再次drawnow)。

答案 4 :(得分:0)

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);