% 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 不同 .
Edit @Jonas指出了一个潜在的改进来过滤 findall 的结果,因为至少传说和颜色条似乎有非空的 Tag 属性:用上面的代码片段替换最后一行
4 回答
使用FINDALL:
如果您想在Matlab中的任何位置获取所有轴控制柄,您可以执行以下操作:
EDIT
要回答问题的第二部分:您可以通过获取句柄
type
属性来测试句柄列表是否为轴:isAxes
对于axes
类型的每个句柄都为true .EDIT2
要仅选择非图例的轴手柄,您需要清除轴列表(
ax
句柄,方法是删除标签不是'legend'
或'Colorbar'
的所有句柄:Jonas的解决方案对我不起作用,因为有一些句柄指的是传说 . 令人惊讶的是,传说似乎被实现为轴,至少在Matlab 2010a中 . 如果你只想要轴,而不是任何图例或其他东西,这是一个解决方案 .
该脚本通过整理出显示为类型轴子类型的句柄来工作,例如
scribe.legend
.对于那些试图改进上述代码片段的人的警告:使用类似的东西
可能无法按预期工作:
“Jonas”和“tm1”的答案对某些人有用 . 但是,正如tm1指出的那样,“轴”类型中有几个项目 .
要准确引用图例或轴本身(可能存在其他项目),您需要使用其特征属性区分它们 .
在我的例子中,我打开了“属性编辑器”并查找了轴和图例的不同属性(因为它们都属于“类型,轴”) . 我试图复制我的轴及其传奇:
我也可以使用“Property Inspector”中的其他属性,而不是'Tag'属性 . 问题是,他们必须有所不同 . 他们的大多数属性是相同的 .
@ tm1的解决方案非常出色 . 我的功能稍微复杂一点(如果您对函数式编程没有问题):
ax
将仅包含绘图轴 . 这是因为图例或颜色条对象的class
与axes
不同 .Edit @Jonas指出了一个潜在的改进来过滤
findall
的结果,因为至少传说和颜色条似乎有非空的Tag
属性:用上面的代码片段替换最后一行这两种技术都很糟糕,未来可能会破裂(与ggplot2或Bokeh的比较可能会很有趣) .