代码之家  ›  专栏  ›  技术社区  ›  YYC

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

  •  34
  • YYC  · 技术社区  · 16 年前

    给定数字句柄 hf ,我发现 get(hf, 'children')

    人物之子 . 包含图形中显示的所有轴、用户界面对象的句柄的矢量。您可以更改控制柄的顺序,从而更改显示器上对象的堆叠。

    得到(hf,“孩子们”) 是斧柄吗?

    4 回复  |  直到 16 年前
        1
  •  41
  •   Jonas    13 年前

    使用 FINDALL :

    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'}))
    
        2
  •  2
  •   tm1    13 年前

    乔纳斯的解决方案对我不起作用,因为有一些处理涉及传奇。令人惊讶的是,图例似乎被实现为轴,至少在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);
    

    该脚本的工作方式是对显示为类型axes的子类型的句柄进行排序,例如 scribe.legend .

    对那些试图改进上述代码片段的人的警告:使用

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

    ??? Error using ==> cellfun
    scribe.legend type is not currently implemented.
    
        3
  •  2
  •   Ozan Oğuz HAKTANIR    13 年前

    “乔纳斯”和“tm1”的答案对某些人有用。然而,正如tm1所指出的,在类型“axes”中有几个项。

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

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

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

        4
  •  2
  •   Ahmed Fasih    13 年前

    @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 图例或colorbar对象的 axes .

    编辑 findall ,因为至少图例和颜色条似乎不为空 Tag 属性:将上面代码段中的最后一行替换为

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

    这两种技术都是不成熟的,将来可能会出现突破(与ggplot2或Bokeh进行比较可能会很有趣)。