【问题标题】:Get multiple axes handles at once一次获取多个轴句柄
【发布时间】:2016-04-09 14:30:25
【问题描述】:

我正在寻找一种单线器来一次获取多个轴句柄在一个对象数组中,这样它就可以传递给linkaxes。我专门寻找不使用循环的单行语句。我知道我过去曾使用几个嵌套函数完成此操作,但我不知道我做了什么。

函数gca 可用于获取特定图形的轴句柄,尽管此功能似乎没有记录在案。例如,调用 gca(3) 来获取图 3 的轴句柄。过去我想我可以调用 gca([1:4]) 来获取所有四个轴句柄,但这似乎不起作用。

我知道我可以通过调用get([1:4],'currentaxes') 来使用get,它会返回一个轴句柄元胞数组。但是,我还没有找到将对象元胞数组转换为对象数组的方法。

我正在使用 MATLAB R2015a。

【问题讨论】:

  • 图形和/或轴的生成方式是否无法存储它们的句柄?

标签: matlab matlab-figure


【解决方案1】:

这个怎么样?

cell_of_axes = get([1:4], 'currentaxes');
array_of_axes = [cell_of_axes{:}];
linkaxes(array_of_axes);

【讨论】:

  • 嗯,这确实有效,而且肯定比 for 循环更好,尽管我希望只有一个语句。但这可能是不可能的。
  • 是的,MATLAB 语法不允许您将其设为单行,因为您无法将 {:} 添加到对 get(...) 的调用末尾。
  • @ThomasIbbotson that's not strictly true
【解决方案2】:

构建轴后:

figure(1); axes();
figure(2); axes();
figure(3); axes();

单行很有趣:

linkaxes(arrayfun(@(k) get(k,'CurrentAxes'), 1:3));

稍后编辑

显然这只适用于老式图形(其中图形对象的句柄是double 数字)。 arrayfun 无法将新的句柄图形(是正确的对象)累积在单个数组中:

http://www.mathworks.com/help/matlab/graphics_transition/graphics-handles-are-now-objects-not-doubles.html

也许更简单的单线:

linkaxes(findobj(1:3,'Type','Axes'));

会起作用的...

【讨论】:

  • 我被告知我需要将'UniformOutput' 设置为false,这会产生一个元胞数组,因此与linkaxes 不兼容。这不会发生在你身上吗?
  • @DavidK 你有没有轴的数字吗?如果是,请将它们从数组中删除(例如从 1:3 开始)。
  • @DavidK 另外:它适用于我给出的示例代码吗?
  • 这在 MATLAB R2015b 中不起作用,因为:“matlab.graphics.axis.Axes 输出类型不受支持。将 'UniformOutput' 设置为 false。”。
  • @DavidK 不是比赛,所以没关系。 :-) 在发布我的编辑后,我实际上对他的回答投了赞成票。
【解决方案3】:

除了已经发布的答案之外,一个可能的单行解决方案可能是:

linkaxes(findobj('type','axes'))

它还允许隐式地阻止考虑 figure 而不考虑 axes

希望这会有所帮助。

【讨论】:

    【解决方案4】:

    如果您只想链接特定的轴子集并将它们作为对象存储在单元格中:

    linkaxes([all_axes{:}], 'x');
    

    【讨论】:

      猜你喜欢
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多