在某些数据集可能为空时创建图例

时间:2017-08-01 18:00:17

标签: matlab plot matlab-figure legend

对于我的项目,我有六组数据放在散点图上,如下所示:

plot(ax, ay, '.r', bx, by, '.b', cx, cy, '.m', dx, dy, '.c', ex, ey, '.y', fx, fy, '.k');

有时这些数据集将为空,因此bxby可能没有任何内容,因此会被跳过。

有没有办法构建一个能够将正确的标签与正确的彩色数据相匹配的图例?换句话说,即使没有[cx, cy]'c'中的数据也会始终与洋红点旁边的图例上的标签'b'匹配。我目前的传说如下:

legend('a', 'b', 'c', 'd', 'e', 'f', -1);

谢谢!

3 个答案:

答案 0 :(得分:3)

如果您首先将包含empty data的任何集合替换为NaN值,则可以获得所需的结果。例如:

x = [];
y = [];

if isempty(x) || isempty(y)
  x = nan;
  y = nan;
end

plot(1:10, rand(1,10), 'r', x, y, 'g', 1:10, rand(1,10), 'b');
legend('r', 'g', 'b');

enter image description here

xy保留为空会在创建图例时发出警告并导致图例不正确。将空向量([])传递给plot命令时,它不会为该数据创建line object。传递NaN值时,它会创建但不会呈现行对象,因此它仍然存在,并且可以为其生成图例条目。

答案 1 :(得分:1)

另一种不使用x=NaN;的可能性是在边界外使用“虚拟图”。

此过程的缺点是您需要手动选择边界,如果您在主图中进行了任何更改,则还需要手动更改虚拟图。在自动化地块中使用的坏主意。此外,如果图例被删除并再次调用(在插入菜单中或通过legend off; legend show

优点是您可以按照与图例不同的顺序绘制它。在绘制在某些区域中覆盖的多种线类型和厚度时,这可能很重要。例如,在下图中,如果先绘制绿色,它将在蓝线下的 x <5 区域消失。

代码示例:

x_e = [];
y_e = [];

figure() 

hold on
plot(100,100, '--g', 100,100, 'r', 100,100, 'b');   %dummy plot

x=1:10;
y=[1 3 3 3 3 4 5 6 9 10]/10;
y2=[1 3 3 3 3 7 6 6 4 3]/10;

plot(x,y2, 'b',x_e, y_e, 'r',x, y, '--g','linewidth',2);
set(gca,'box','on',... %box just to be prettier 
    'Xlim',[1 10], 'Ylim',[0 1]) % relevant set up!
legend('data 1', 'data 2', 'data 3');

它给出了这个图: enter image description here

答案 2 :(得分:1)

要使用@gnovice answer中提出的优势完成@Guto answer,如果行的顺序很重要,您仍然可以使用NaN,并在其后设置顺序:

x = 1:10;
% plot and get the handle to the lines:
p = plot(x,x,'--g',nan,nan,'r',x,x,'b','linewidth',2);
% set the order of the lines from front to back:
set(p(1).Parent,'Children',p(1).Parent.Children([3 2 1]))
% add the legend:
legend('data 1', 'data 2', 'data 3');

在上面的例子中,我们将绿线置于蓝色的顶部:

enter image description here