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
将仅包含绘图轴。这是因为图例或颜色条对象的class
与axes
不同。
编辑 @Jonas 指出了过滤findall
的结果的潜在改进,因为至少图例和颜色条似乎具有非空Tag
属性:替换最后一行上面的代码 sn-p 和
ax = ax(strcmp('', get(ax, 'Tag')))
这两种技术都很笨拙,将来可能会失效(与 ggplot2 或 Bokeh 进行比较可能会很有趣)。
【讨论】:
mlint(Matlab 编辑器用来在代码中添加难看颜色下划线的源代码分析器)愚蠢地说我应该使用isa
而不是 strcmp(class(...), '...')
但当然不是在这里工作是因为图例/颜色条对象 是 axes
对象(axes
是父类);我们必须过滤掉它们,因为原来的 findall
axes
对象返回了它们!以上是关于Matlab:如何获取图形句柄中的所有轴句柄?的主要内容,如果未能解决你的问题,请参考以下文章