当某些数据集可能为空时制作图例

Posted

技术标签:

【中文标题】当某些数据集可能为空时制作图例【英文标题】:Making a legend when some of the data sets could be empty 【发布时间】:2018-01-08 17:31:49 【问题描述】:

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

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

谢谢!

【问题讨论】:

不容易,变量的值是从excel中读取的值的数组。例如,ax 是 x 坐标的列表,如 [1,2,3,4],y 是对应的 y 坐标。问题是,当数组 bx 和 by 为空时(因为电子表格中没有数据),图例中的标签不起作用。我可以编辑操作以显示我现在的图例在做什么,但我很难给出变量值。 【参考方案1】:

如果首先将包含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');

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

【讨论】:

【参考方案2】:

利用@Guto answer 中提出的优势完成@gnovice 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');

在上面的例子中,我们把绿线放在蓝线的上面:

【讨论】:

【参考方案3】:

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

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

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

代码示例:

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');

它给出了这个图表:

【讨论】:

我没有比其他答案更有优势,你能在你的例子中证明它吗? 非常感谢。我绘制了我提醒的第一个例子。我经常使用这种技术,因为它允许在多个图上使用一个图例,但我不确定添加,所以这里略过,有点超出范围。 当我运行你的例子时,我得到different result 我使用的是 2014b。即使我将图例调用移到最后一行,它也会得到相同的输出(因为只有 3 个名称条目)。要重现它,我需要删除图例并从 matlab insert 菜单选项中再次询问。 感谢您的关注。我已经相应地更新了答案和代码片段。顺便说一句,改变绘图顺序也很有趣。

以上是关于当某些数据集可能为空时制作图例的主要内容,如果未能解决你的问题,请参考以下文章

Room Database TypeConverter 未在某些集合中使用,例如字符串集

CakePHP - 当某些字段为空时,防止模型数据保存在 saveMany 调用中

Chart.js 从图例中删除数据集值的标签

echarts中跨域动态获取数据时,当某些对应的数据为空时,鼠标滑动到所在位置卡死

当某个值返回为空时,如何使用下拉列表中的选定值?

vue中当数据为空时的处理