在绘图中隐藏一些图形对象的MATLAB图例条目

4

MATLAB图例会列出绘图中的所有内容,包括您放在绘图上的指南线。

解决这个问题的方法是执行以下操作:

*Plot
*Add legend
*Add guidelines

然而,MATLAB将最近的行放在前面,这意味着准则会覆盖显示的数据;难看且分散注意力。任何时候构建复杂绘图时都会出现类似问题,legend会抓取所有内容,使用绘图顺序的变通方法可能很丑陋。
示例代码:
%**** Optional guidelines
figure(1)
plot([2 2],[0,1],'k--'); hold on

%**** DATA
N = 4;
y=rand(5,N);
x=1:1:5;
for plotLoop=1:N;
  %* Plot
  figure(1)
  plot(x,y(plotLoop,:));
  hold on
end

%*****LEGEND
hLegend = legend(LegTxt,...
                'interpreter','latex',...
                'location','eastoutside')

将代码块的顺序移动以复制上述提到的情况。

如何合理解决这个问题?


我已经更新了标题,使其更加通用 - 它可能不仅仅是指南,还可能是您不想显示为图例条目的错误栏或类似内容。 - Jonas
3个回答

6
如果您希望某个特定的图形对象不生成图例(即使您切换了图例的开关),您可以修改LegendInformation
%# plot something that shouldn't show up as legend
handleWithoutLegend = plot(something);

%# modify the LegendInformation of the Annotation-Property of the graphical object
set(get(get(handleWithoutLegend,'Annotation'),'LegendInformation'),...
    'IconDisplayStyle','off');

%# toggle legend on and off at will, and never see the something-object appear

如果您试图关闭一个句柄数组中的图例,最好的方法就是循环遍历它们,并使用try-wrapper针对无法生成图例的图形对象:
for h = listOfHandles(:)'
   try
      set(get(get(h,'Annotation'),'LegendInformation'),...
        'IconDisplayStyle','off');
   end
end

1
我建议将这个命令打包成一个名为“noLegend”之类的函数,因为我实在记不住它。 - Jonas
我尝试使用这段代码,但是在 get(bla, 'LegendInformation') 处出现了错误 Conversion to double from cell is not possible.。你知道为什么吗?我猜这段代码只适用于某些图形对象,而不是所有的对象? - Mark_Anderson
@Mark_Anderson:我现在添加了一个循环解决方案,应该可以解决你的问题。 - Jonas

3
制作一个自定义句柄并将其输入到“legend”中。 绘图句柄可以连接在一起形成一个对象,传递给“legend”作为输入。
所需代码并不美观,但它确实有效。
%**** Optional guidelines for periodicity
figure(1)
plot([2 2],[0,1],'k--'); hold on

%**** DATA
N = 4;
y=rand(5,N);
x=1:1:5;

for plotLoop=1:N;
  LegTxt{plotLoop} = num2str(plotLoop);
  %* Plot
  figure(1)

  % if statement to construct a handle for the legend later
  if plotLoop==1 
      htot=plot(x,y(plotLoop,:));
  else
      h=plot(x,y(plotLoop,:));
      % Append this info to the figure handle
      htot= [htot, h];
  end
  hold on

end

%*****LEGEND
hLegend = legend(htot,LegTxt,...
                'interpreter','latex','FontSize',16,...
                'location','eastoutside')

如果您很严谨或好奇,那么循环for plotLoop=1:N;出现在这里是因为我从一些相当复杂的代码中提取了例子,其中数据是从单元数组中提取的。显然,在许多使用场景下,您可以消除该循环,我只是决定保持代码的最大灵活性!


这个方法是可行的,但如果您手动切换图例的开关,然后再次打开,那么不需要的项目仍然会出现。幸运的是,还有另一种解决方案:https://dev59.com/Wp_ha4cB1Zd3GeqPz4ON#42471561 - Jonas
好的,我从未在MATLAB中使用手动绘图工具,所以我没有遇到过这个问题! - Mark_Anderson
你可以为图形句柄预分配一个数组htot=gobjects(1,N)。然后,你可以执行 htot(plotLoop) = plot(...)。此外,你还可以将图例文本添加到绘图命令本身,这将进一步简化此代码。 - Cris Luengo

1
您还可以以另一种方式从图例中隐藏图表。以下是示例:

figure(1)
hold on

x=1:10;
y1=x;
y2=x.^2/10;
y3=x.^3/100;

plot(x,y1);
plot(x,y2,'HandleVisibility','off');
plot(x,y3);

legend('x','x^3')

您只需要在不想在图例中显示的绘图中加入'HandleVisibility', 'off'。效果如下所示:

sample result

HandleVisibility是一个线条属性,因此如果您以其他方式创建绘图,则可能无法正常工作。但对于大多数用例来说,它已经足够简单了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接