Matlab 在每次迭代后添加到图例

Matlab 在每次迭代后添加到图例,matlab,legend,Matlab,Legend,我跑 从第一个脚本开始。 然后,等一下。 我运行了类似的第二个脚本。 我正确地看到了两张图,但只看到了最初的图例。 我想从不同的脚本中增加图例 如何从单个脚本添加到图例中?处理此问题的最简单方法是在创建图例时将句柄保存到图例中,然后在准备使用包含其他系列的新图例更新绘图时,删除图例并创建新图例: loglog(x,y); legend('First script'); 通常对于图形对象,比如文本框,我会说只要通过句柄重用对象(不要删除)。但是,如果您更新图例而不是替换它,那么您需要担心的不仅仅

我跑

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


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

处理此问题的最简单方法是在创建图例时将句柄保存到图例中,然后在准备使用包含其他系列的新图例更新绘图时,删除图例并创建新图例:

loglog(x,y);
legend('First script');
通常对于图形对象,比如文本框,我会说只要通过句柄重用对象(不要
删除
)。但是,如果您更新图例而不是替换它,那么您需要担心的不仅仅是字符串。事实上,这似乎解决了这个问题


作为
delete
和create new的替代方法,您还可以使用
legend('off')开关图例;图例(“显示”)正如Eugenio评论中的答案所示。

另一种可能的方法是“显示名称”:

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...
从何处打印到任意轴时只需使用此属性:)

还有更多的事情是可能的,比如动态传奇

有关更多信息,请参见:

编辑


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

我遇到了一个类似的问题:我先绘制了三组实验数据,然后进入参数估计以模拟函数,每次都想绘制模型数据,保留实验数据,但从上一次运行中删除了模型数据。我想让传奇人物来证明这一点。我能够用不同问题的综合解决方案来做这件事

初始命令(我的主命令的顶部)

全部关闭
将确保每次绘图都重新开始

第一个情节(在我的主要部分)

drawnow
强制立即绘制绘图,而
h_old
只是我稍后使用的一个“占位符”。我选择0250是因为它在数据范围内(否则会弄乱轴)

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

我删除了
h_old
,并用我创建的新绘图覆盖它。这样,在第二次迭代时,第二次迭代的绘图将被绘制,第一次迭代的绘图将被删除,在这些操作之后,我让它显示绘图(再次
drawnow
)。

最简单的方法是:

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

这是几个方法的连接,非常简单,可以在任何地方使用。

不可能在图例中添加条目,因此必须使用当前图例中的数据构建新图例。这里给出了一个可能的解决方案:简单的答案,不可能,只有解决方法可用。最后再写一次图例就容易多了。这是一个很好的功能,但是在绘制完所有内容之前,你不会得到图例<代码>-另一方面,dynamicLegend
是一个很好的解决方案,至少在原则上是这样。希望MathWorks能够解决后一个特性中的错误(zoom抛出错误)。@chappjc好吧,关于放大时的错误,我建议阅读关于未记录的matlab的文章。Yair Altman解释了如何摆脱这个:)关于传说的出现:我不明白你所说的“在你把一切都策划好之前不要得到传说”是什么意思。也许你的意思是,它不会自动更新。如果有人需要的话,只需将图例关闭再打开……这完全正确,关闭再打开是我在回答中给出的解决方案。OP希望运行代码,生成绘图和图例,查看它,运行第二个任意脚本,使用更新的图例查看它,。。。(对吗?)如果仅在循环之后调用
legend
,则不会得到该结果
DisplayName
很好,但它并不能像OP想要的那样为您提供动态图例——在循环中,您需要
legend('off');图例(“显示”)在绘图之后。正如我们所知,这是一个相当微不足道的变化,但这是一个解决方案。无论如何,如果MATLAB只是为图例提供了一个
'auto'
选项,那就太好了。:)@我明白了!我不明白这样的问题。。。我还以为OP是在问如何为传奇人物提供信息。DisplayName和字符串的单元格数组对此很有用。使用图例(关闭/打开)和DynamicGend更新图例都是可能的。虽然这可能是OP想要的答案,但您应该用代码提供解释。简单地粘贴代码并不能真正帮助OP理解他们的错误,也无助于让未来的观众更好地了解这个问题。太棒了,+1。legend(gca,'off')是做什么的?@user3804598如果你还在想,legend(gca,'off')与它正下方的线配对。本质上,它关闭了图例(下面的一行将其重新打开),这迫使Matlab刷新并显示新的图例更改。
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);
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
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);
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');