首页 文章

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

提问于
浏览
32

如何获得图形手柄中的所有轴手柄?

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

这个人物的孩子 . 包含所有轴的手柄的矢量,图中显示的用户界面对象 . 您可以更改手柄的顺序,从而更改显示屏上对象的堆叠 .

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

谢谢!

4 回答

  • 33

    使用FINDALL

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

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

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

    EDIT

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

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

    isAxes 对于 axes 类型的每个句柄都为true .

    EDIT2

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

    axNoLegendsOrColorbars= ax(~ismember(get(ax,'Tag'),{'legend','Colobar'}))
    
  • 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.
    
  • 2

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

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

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

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

    我也可以使用“Property Inspector”中的其他属性,而不是'Tag'属性 . 问题是,他们必须有所不同 . 他们的大多数属性是相同的 .

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

    Edit @Jonas指出了一个潜在的改进来过滤 findall 的结果,因为至少传说和颜色条似乎有非空的 Tag 属性:用上面的代码片段替换最后一行

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

    这两种技术都很糟糕,未来可能会破裂(与ggplot2或Bokeh的比较可能会很有趣) .

相关问题