以下stackoverflow问题:
标识如何从 Matlab 中的图形中获取所有轴的句柄。但是,此列表还将包含图例的句柄,至少在 R2008a 中,这些句柄似乎也是轴。如何(以编程方式)从轴句柄向量中的真实绘图轴中分辨出图例?
从linkaxes
,您想要的代码是:
ax = findobj(gcf,'type','axes','-not','Tag','legend','-not','Tag','Colorbar');
这将返回当前图中所有数据轴的句柄。
1) 默认情况下Tag
,legend 的属性是 'Legend'。当然,不能保证它不会改变。
get(l)
....
BusyAction: 'queue'
HandleVisibility: 'on'
HitTest: 'on'
Interruptible: 'off'
Selected: 'off'
SelectionHighlight: 'on'
**Tag: 'legend'**
Type: 'axes'
UIContextMenu: 200.0018
UserData: [1x1 struct]
....
2)另一个区别(更强大)是常规轴没有String
属性,但图例有。我不确定是否还有其他类型的对象也具有String
属性。例如:
plot(magic(3));legend('a','v','b');
allAxesInFigure = findall(f,'type','axes')
b = isprop(allAxesInFigure,'String')
您可以通过调用来验证它:
得到(gca,'字符串')
???使用 ==> 时出错
'axes' 类中没有 'String' 属性。
但另一方面,对于传说来说,有这样的属性。这就是它更健壮的原因。
plot(magic(3)); l = legend('a','b','c');
get(l,'String')
答案 = 'a' 'b' 'c'
3)我建议在更广泛的背景下解决这个问题。只需通过存储句柄来跟踪您创建的图例和轴。也就是说,而不是像这样编码:
plot(magic(3));
legend('a','v','b');
plot(magic(5));
legend('a','v','b','c','d');
像这样的代码:
p(1) = plot(magic(3));
l(1) = legend('a','v','b');
p(2) = plot(magic(5));
l(2) = legend('a','v','b','c','d');
只需在您提到的stackoverflow问题中稍微修改我的答案代码:
axesHandles = get(fig, 'Children');
classHandles = handle(axesHandles);
count = length(axesHandles);
isLegend = false(1, count);
for i = 1:count
isLegend(i) = strcmp(class(classHandles(i)), 'scribe.legend') == 1;
end
legendHandles = axesHandles(isLegend);
不幸的是,这个解决方案取决于实现细节。