提取图数据

有几次,我有一个有趣的人物,但我丢失了对其数据的访问权限。此示例显示了如何从图中获取提取信息的技巧。

关键功能是 findobjgetfindobj 返回给定对象的属性或属性的对象的处理程序,例如 TypeColor 等。一旦找到了行对象, get 就可以返回属性所持有的任何值。事实证明,Line 对象包含以下属性中的所有数据:XDataYDataZData; 除非图中包含 3D 图,否则最后一个通常为 0。

下面的代码创建了一个示例图,显示了 sin 函数,阈值和图例两行

t = (0:1/10:1-1/10)';
y = sin(2*pi*t);
plot(t,y);
hold on;
plot([0 0.9],[0 0], 'k-');
hold off;
legend({'sin' 'threshold'});

findobj 的第一次使用会向两行返回两个处理程序:

findobj(gcf, 'Type', 'Line')
ans = 
  2x1 Line array:

  Line    (threshold)
  Line    (sin)

为了缩小结果, findobj 还可以使用逻辑运算符 -and-or 和属性名称的组合。例如,我可以找到一个线对象,其 DiplayNamesin 并读取其 XDataYData

lineh = findobj(gcf, 'Type', 'Line', '-and', 'DisplayName', 'sin');
xdata = get(lineh, 'XData');
ydata = get(lineh, 'YData');

并检查数据是否相等。

isequal(t(:),xdata(:))
ans =
     1
isequal(y(:),ydata(:))
ans =
     1

同样,我可以通过排除黑线(阈值)来缩小我的结果:

lineh = findobj(gcf, 'Type', 'Line', '-not', 'Color', 'k');
xdata = get(lineh, 'XData');
ydata = get(lineh, 'YData');

并且最后一次检查确认从该图中提取的数据是相同的:

isequal(t(:),xdata(:))
ans =
     1
isequal(y(:),ydata(:))
ans =
     1