如何获取图形句柄中的所有轴句柄?
给定图形句柄hf
,我发现它get(hf, 'children')
可能会返回所有轴的句柄。但是,Matlab 帮助建议它可能返回的不仅仅是轴句柄:
孩子们的身影。一个向量,包含所有轴的句柄,图中显示的用户界面对象。您可以更改手柄的顺序,从而更改显示中对象的堆叠。
有没有办法只获取图形句柄中的轴句柄?或者我怎么知道返回的手柄get(hf, 'children')
是否是斧头手柄?
谢谢!
使用查找:
allAxesInFigure = findall(figureHandle,'type','axes');
如果要在 Matlab 中的任何位置获取所有轴句柄,可以执行以下操作:
allAxes = findall(0,'type','axes');
编辑
要回答问题的第二部分:您可以通过获取句柄type
属性来测试句柄列表是否是轴:
isAxes = strcmp('axes',get(listOfHandles,'type'));
isAxes
对于每个类型的句柄都是如此axes
。
编辑2
要仅选择不是图例的轴句柄,您需要清理轴列表(ax
句柄,方法是删除标签不是'legend'
或的所有句柄'Colorbar'
:
axNoLegendsOrColorbars= ax(~ismember(get(ax,'Tag'),{'legend','Colobar'}))
Jonas 的解决方案对我不起作用,因为有些句柄指的是传说。令人惊讶的是,图例似乎被实现为轴,至少在 Matlab 2010a 中。如果您只想要轴,而不想要任何图例或其他东西,这是一个解决方案。
axesHandles = get(fig, 'Children');
classHandles = handle(axesHandles);
count = length(axesHandles);
isNotInstanceOfSubtype = false(1, count);
for i = 1:count
isNotInstanceOfSubtype(i) = strcmp(class(classHandles(i)), 'axes') == 1;
end
axesHandles = axesHandles(isNotInstanceOfSubtype);
该脚本通过整理显示为轴类型子类型的句柄来工作,例如scribe.legend
.
对那些试图改进上述代码片段的人的警告:使用类似的东西
classHandles = cellfun(@(x) handle(x), axesHandles)
可能无法按预期工作:
??? Error using ==> cellfun
scribe.legend type is not currently implemented.
“Jonas”和“tm1”的答案对某些人有用。但是,正如 tm1 指出的问题,“轴”类型中有几个项目。
要准确引用图例或轴本身(可能存在其他项目),您需要使用它们的特性来区分它们。
在我的示例中,我打开“属性编辑器”并查找轴和图例的不同属性(因为它们都属于“类型,轴”)。我试图复制我的轴及其图例:
copied_axes = findobj(temp_fig,'type','axes','Tag','');
copied_legend = findobj(temp_fig,'type','axes','Tag','legend');
除了“标签”属性,我还可以使用“属性检查器”中的其他属性。问题是,它们必须不同。它们的大部分属性是相同的。
@tm1 的解决方案非常好。我的复杂一点(如果你对函数式编程没问题):
% initialize `fig` somehow, i.e., "fig=gcf()" for the current figure or
% "fig=get(0,'children')" for all open figures; can be vector or scalar.
ax = findall(fig, 'type', 'axes');
ax = ax(arrayfun(@(i) strcmp(class(handle(i)), 'axes'), ax));
ax
将仅包含绘图轴。这是有效的,因为class
图例或颜色条对象的 不同于axes
.
编辑@Jonas 指出了过滤结果的潜在改进findall
,因为至少图例和颜色条似乎具有非空Tag
属性:将上述代码片段中的最后一行替换为
ax = ax(strcmp('', get(ax, 'Tag')))
这两种技术都很笨拙,将来可能会崩溃(与 ggplot2 或 Bokeh 的比较可能会很有趣)。