8

我想创建一个图形,一旦创建了子图,我想同时将属性应用于所有这些,而无需通过 for 循环。事实上,我想在不需要通过 for 循环的情况下执行以下所有操作:

  • 创建没有 for 循环的所有子图。(例如,创建一个带有 4x5 子图的图形,而不是使用 for 循环)。
  • 将相同的背景颜色应用于每个带有 oa 循环的子图。
  • 将相同的轴命令应用于所有这些 w/oa for-loop。(如轴相等,轴紧等)。

有没有办法做到这一点?

4

2 回答 2

11

最方便的方法是创建一个坐标区句柄数组,然后设置属性:

for i=1:4,
   axesHandles(i) = subplot(2,2,i);
   plot(...)
end

%# set background to black for all handles in the array
%# note that this needs no loop
set(axesHandles,'color','k')

如果您没有收集坐标区句柄,则需要先收集句柄数组。为此,您可以使用图形窗口的子属性(gcf获取当前活动图形的句柄)

axesHandles = get(gcf,'children');

如果您有多个图形的坐标轴,您可以使用它findall来收集所有内容:

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

从那时起,它又是一个单一的呼叫set, 或axis, 例如

set(axesHandles,'color','k','lineWidth',2)
axis(axesHandles,'tight')
于 2012-09-02T13:12:16.673 回答
2

我不明白为什么你认为那个for循环是邪恶的,但无论如何......

这是您问题的第 2 部分和第 3 部分的答案,假设轴句柄保存在数组中:

   a(1) = axes();
   a(2) = axes();
   arrayfun( @(x)(set(x,'Color','r')),a);
   arrayfun( @(x)(axis(x,'equal')),a);

arrayfun对 .中的每个元素应用一个函数a。在这种情况下,匿名函数只是用以下方式编写它的快捷方式:

   a(1) = axes();
   a(2) = axes();
   arrayfun( @SetRedColor ,a);
   arrayfun( @SetAxisEqual,a);

   function SetRedColor(x)
       set(x,'Color','r');
   end

   function SetAxisEqual(x)
       axis(x,'equal');
   end

另一种可能的方法是链接轴,并仅设置一个属性:

   linkprop(a,'Color');
   set(a(1),'Color','r'); %#Now a(2) color is also red
于 2012-09-02T12:37:19.287 回答