动态图例(每次递归更新)

时间:2014-02-10 19:15:22

标签: matlab legend matlab-figure figure

我得到了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;

此代码更新每次递归中的唯一音高,偏航值(它们之间没有空格,因此很有刺激性)但未能:

  
      
  1. 使用适当的颜色,如图所示。
  2.   
  3. 保持上一次迭代的颜色和pitch,yaw
  4. 的值   

3 个答案:

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

然后添加到轴的图将添加到图例中:

enter image description here

如果半成品特征不是您的一杯茶,请使用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)

step1

要更新我们的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;

返回:

yay

此功能可以包装到通用帮助程序函数中,以支持附加一个或多个图例条目。我们已经使用legtools on GitHub

完成了这项工作

答案 2 :(得分:0)

As of MATLAB 2017a,添加或删除图形对象时,图例会自动更新。

因此,现在不需要执行任何特定操作。一个创建图例,然后在循环中可以向轴添加线,它们将自动出现在图例中。