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

Posted

技术标签:

【中文标题】Matlab:如何获取图形句柄中的所有轴句柄?【英文标题】:Matlab: How to obtain all the axes handles in a figure handle? 【发布时间】:2011-04-25 16:46:23 【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

【参考方案1】:

使用FINDALL:

allAxesInFigure = findall(figureHandle,'type','axes');

如果您想在 Matlab 中的任何位置获取所有坐标轴句柄,您可以执行以下操作:

allAxes = findall(0,'type','axes');

编辑

回答问题的第二部分:您可以通过获取句柄type 属性来测试句柄列表是否为轴:

isAxes = strcmp('axes',get(listOfHandles,'type'));

isAxes 将适用于 axes 类型的每个句柄。

EDIT2

要仅选择不是图例的坐标区句柄,您需要清理坐标区列表(ax 句柄,方法是删除标签不是'legend''Colorbar' 的所有句柄:

axNoLegendsOrColorbars= ax(~ismember(get(ax,'Tag'),'legend','Colobar'))

【讨论】:

如果您的人物有图例/颜色条/等,简单的 findall 将不起作用:这些是您引用的文档中提到的“用户界面对象”,并且 f∈dallfindall 将也将句柄返回给那些。您需要通过 strcmp(class(hand≤(potentialhand≤)))strcmp(class(handle(potentialhand))) 将 f∈dallfindall 与 strcmpstrcmp 结合起来,而不是 typetype 而是类测试。 @AhmedFasih:感谢您的提醒。要删除图例和颜色条,幸运的是您也可以使用 'tag' 属性。当然,如果你只想要非标记轴,你可以简单地做ax(strcmp('',get(ax,'Tag')) 所以最后findall(figureHandle,'type','axes','tag','')是最短的方法。 只需简短评论即可获取 figureHandle:figureHandle= findobj('Type','figure'); @Diiiiii: findobj 只会找到带有可见句柄的图形。这可能不够好,也可能不够好。【参考方案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

对那些试图改进上述代码 sn-p 的人的警告:使用类似的东西

classHandles = cellfun(@(x) handle(x), axesHandles)

可能无法按预期工作:

??? Error using ==> cellfun
scribe.legend type is not currently implemented.

【讨论】:

您可以将整个 strcmp 调用包装在 cellfun/arrayfun 中(请参阅我的回答)。【参考方案3】:

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

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

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

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

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

【讨论】:

【参考方案4】:

@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 将仅包含绘图轴。这是因为图例或颜色条对象的classaxes 不同。

编辑 @Jonas 指出了过滤findall 的结果的潜在改进,因为至少图例和颜色条似乎具有非空Tag 属性:替换最后一行上面的代码 sn-p 和

ax = ax(strcmp('', get(ax, 'Tag')))

这两种技术都很笨拙,将来可能会失效(与 ggplot2 或 Bokeh 进行比较可能会很有趣)。

【讨论】:

mlint(Matlab 编辑器用来在代码中添加难看颜色下划线的源代码分析器)愚蠢地说我应该使用 isa 而不是 strcmp(class(...), '...') 但当然不是在这里工作是因为图例/颜色条对象 axes 对象(axes 是父类);我们必须过滤掉它们,因为原来的 findall axes 对象返回了它们!

以上是关于Matlab:如何获取图形句柄中的所有轴句柄?的主要内容,如果未能解决你的问题,请参考以下文章

matlab中的GUI,轴中的图像循环

如何获取从句柄到 Matlab 中方法的输出数量?

Win32获取屏幕句柄的函数是啥?

以编程方式在 UIPanel 中对齐轴句柄 - Matlab

delphi 如何获取其它应用程序窗体中的所有控件句柄

如何在 Matlab 中测试变量是不是是函数句柄