提取图数据
有几次,我有一个有趣的人物,但我丢失了对其数据的访问权限。此示例显示了如何从图中获取提取信息的技巧。
关键功能是 findobj 和 get 。 findobj 返回给定对象的属性或属性的对象的处理程序,例如 Type
或 Color
等。一旦找到了行对象, get 就可以返回属性所持有的任何值。事实证明,Line
对象包含以下属性中的所有数据:XData
,YData
和 ZData
; 除非图中包含 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
和属性名称的组合。例如,我可以找到一个线对象,其 DiplayName
是 sin
并读取其 XData
和 YData
。
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