我得到了for i=1:15
。在内部我生成一个变量d=1:0.01:10
,这是x'x轴,基于此,我创建了一个连续函数F(d),它有2个唯一变量pitch和yaw。然后,我使用cmap = hsv(15);
在每次递归中使用不同的颜色绘制此图。那么它就是:
d=1:0.01:10;
cmap = hsv(15);
for i=1:15
pitch = unidrnd(10);
yaw = unidrnd(10);
for j=1:length(d)
F(j) = d(j)*3*pitch*yaw; %// some long calculation here
end
p1 = plot(d,F,'Linewidth', 1.0);
title ('blah blah')
set(p1, 'Color', cmap(i,:));
hold on;
legend (['pitch,yaw:', num2str(pitch) num2str(yaw)])
end
hold off;
此代码更新每次递归中的唯一音高,偏航值(它们之间没有空格,因此很有刺激性)但未能:
- 使用适当的颜色,如图所示。
- 保持上一次迭代的颜色和
的值 醇>pitch,yaw
。
答案 0 :(得分:27)
使用“动态图例”as described on undocumentedmatlab.com可以为循环中的图例添加线条。
我们的想法是将legend
命令替换为:
legend('-DynamicLegend');
然后使用plot
参数更新DisplayName
命令:
plot(d,F,'Linewidth',1.0,'DisplayName',sprintf('pitch,yaw: %d,%d',pitch,yaw));
然后添加到轴的图将添加到图例中:
如果半成品特征不是您的一杯茶,请使用DisplayName
技巧,只需关闭/打开legend
即可。也就是说,而不是-DynamicLegend
:
legend('off'); legend('show');
different variation that does not use either DisplayName
or -DynamicLegend
是删除并使用存储字符串数组重新创建图例。
official solution recommended by MathWorks它抓住现有的图例线条手柄,并用这些手柄手动更新图例。与上面的动态图例解决方案相比,这非常痛苦:
% Get object handles
[LEGH,OBJH,OUTH,OUTM] = legend;
% Add object with new handle and new legend string to legend
legend([OUTH;p1],OUTM{:},sprintf('pitch,yaw: %d,%d',pitch,yaw))
答案 1 :(得分:1)
作为HG2(R2014 +中的默认值)替代@chappjc官方MW解决方案,人们可以利用传说重新实现为自己的类,而不是其他图形对象的kludge。这已经清理了一些东西,因此它们更容易与之互动。
虽然这些新的legend
对象没有exposed property链接图例项到绘图对象,但它们确实有一个属性'PlotChildren'
,它是一个对象句柄数组。 / p>
例如:
x = 1:10;
y1 = x;
y2 = x + 1;
figure
plot(x, y1, 'ro', x, y2, 'bs');
lh = legend({'Circle', 'Square'}, 'Location', 'NorthWest');
pc = lh.PlotChildren
返回:
pc =
2x1 Line array:
Line (Circle)
Line (Square)
要更新我们的legend
对象而不再次调用legend
,我们可以修改现有'PlotChildren'
对象的'String'
和legend
属性。只要'String'
中的每个对象都有'PlotChildren'
条目,它就会在图例中呈现。
例如:
y3 = x + 2;
hold on
plot(x, y3, 'gp');
% To make sure we target the right axes, pull the legend's PlotChildren
% and get the parent axes object
parentaxes = lh.PlotChildren(1).Parent;
% Get new plot object handles from parent axes
newplothandles = flipud(parentaxes.Children); % Flip so order matches
% Generate new legend string
newlegendstr = [lh.String 'Pentagram'];
% Update legend
lh.PlotChildren = newplothandles;
lh.String = newlegendstr;
返回:
此功能可以包装到通用帮助程序函数中,以支持附加一个或多个图例条目。我们已经使用legtools
on GitHub
答案 2 :(得分:0)
As of MATLAB 2017a,添加或删除图形对象时,图例会自动更新。
因此,现在不需要执行任何特定操作。一个创建图例,然后在循环中可以向轴添加线,它们将自动出现在图例中。