40

如何获取图形句柄中的所有轴句柄?

给定图形句柄hf,我发现它get(hf, 'children')可能会返回所有轴的句柄。但是,Matlab 帮助建议它可能返回的不仅仅是轴句柄:

孩子们的身影。一个向量,包含所有轴的句柄,图中显示的用户界面对象。您可以更改手柄的顺序,从而更改显示中对象的堆叠。

有没有办法只获取图形句柄中的轴句柄?或者我怎么知道返回的手柄get(hf, 'children')是否是斧头手柄?

谢谢!

4

4 回答 4

44

使用查找

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'}))
于 2010-10-14T23:32:43.520 回答
2

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.
于 2013-08-27T10:05:41.097 回答
2

“Jonas”和“tm1”的答案对某些人有用。但是,正如 tm1 指出的问题,“轴”类型中有几个项目。

要准确引用图例或轴本身(可能存在其他项目),您需要使用它们的特性来区分它们。

在我的示例中,我打开“属性编辑器”并查找轴和图例的不同属性(因为它们都属于“类型,轴”)。我试图复制我的轴及其图例:

copied_axes = findobj(temp_fig,'type','axes','Tag','');
copied_legend = findobj(temp_fig,'type','axes','Tag','legend');

除了“标签”属性,我还可以使用“属性检查器”中的其他属性。问题是,它们必须不同。它们的大部分属性是相同的。

于 2013-08-28T13:51:30.147 回答
2

@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 的比较可能会很有趣)。

于 2013-09-03T13:17:11.687 回答