我跑
loglog(x,y);
legend('First script');
从第一个脚本。那么,hold on;
。我运行了类似的第二个脚本。我正确地看到了两张图,但只有最初的图例。我想从不同的脚本中增加图例。
如何从单个脚本添加到图例?
另一种可能的方法是“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'); 图例('显示')
处理此问题的最简单方法是在创建图例时将句柄保存到图例,然后准备使用包含另一个系列的新图例来更新情节,删除图例并创建一个新图例:
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
)。但是,如果您更新图例而不是替换它,您需要担心的不仅仅是字符串。zroth 引用的MathWorks 解决方案实际上似乎解决了这种方法!
作为创建新的替代方案,您还可以根据 Eugenio 评论中的答案建议delete
打开和关闭图例。legend('off'); legend('show');
最简单的方法是:
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');
这是几种方法的连接,它非常简单,可以在任何地方使用。
我有一个类似的问题:我先绘制了三组实验数据,然后进入我的参数估计来模拟函数,并且每次都想绘制模型数据,保留实验数据但删除之前运行的模型数据. 我希望传奇能够证明这一点。我能够结合来自不同问题的解决方案来做到这一点。
初始命令(我的主要命令的顶部)
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
)。
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);