6

以下stackoverflow问题:

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

标识如何从 Matlab 中的图形中获取所有轴的句柄。但是,此列表还将包含图例的句柄,至少在 R2008a 中,这些句柄似乎也是轴。如何(以编程方式)从轴句柄向量中的真实绘图轴中分辨出图例?

4

3 回答 3

12

linkaxes,您想要的代码是:

ax = findobj(gcf,'type','axes','-not','Tag','legend','-not','Tag','Colorbar');

这将返回当前图中所有数据轴的句柄。

于 2012-01-30T23:47:25.760 回答
6

1) 默认情况下Tag,legend 的属性是 'Legend'。当然,不能保证它不会改变。

 get(l)

 ....
 BusyAction: 'queue'
      HandleVisibility: 'on'
               HitTest: 'on'
         Interruptible: 'off'
              Selected: 'off'
    SelectionHighlight: 'on'
                   **Tag: 'legend'**
                  Type: 'axes'
         UIContextMenu: 200.0018
              UserData: [1x1 struct]

 ....

2)另一个区别(更强大)是常规轴没有String​​属性,但图例有。我不确定是否还有其他类型的对象也具有String属性。例如:

  plot(magic(3));legend('a','v','b');
  allAxesInFigure = findall(f,'type','axes')
  b = isprop(allAxesInFigure,'String')

您可以通过调用来验证它:

得到(gca,'字符串')
???使用 ==> 时出错
'axes' 类中没有 'String' 属性。

但另一方面,对于传说来说,有这样的属性。这就是它更健壮的原因。

 plot(magic(3)); l = legend('a','b','c');
 get(l,'String')

答案 = 'a' 'b' 'c'

3)我建议在更广泛的背景下解决这个问题。只需通过存储句柄来跟踪您创建的图例和轴。也就是说,而不是像这样编码:

 plot(magic(3));
 legend('a','v','b');
 plot(magic(5));
 legend('a','v','b','c','d');

像这样的代码:

 p(1) = plot(magic(3));
 l(1) = legend('a','v','b');
 p(2) = plot(magic(5));
 l(2) = legend('a','v','b','c','d');
于 2012-01-30T22:58:29.357 回答
0

只需在您提到的stackoverflow问题中稍微修改我的答案代码:

axesHandles = get(fig, 'Children');
classHandles = handle(axesHandles);
count = length(axesHandles);
isLegend = false(1, count);
for i = 1:count
    isLegend(i) = strcmp(class(classHandles(i)), 'scribe.legend') == 1;
end
legendHandles = axesHandles(isLegend);

不幸的是,这个解决方案取决于实现细节。

于 2013-08-27T10:29:17.013 回答