将绘图属性同时应用于所有MATLAB子图

时间:2012-09-02 12:30:34

标签: matlab plot vectorization subplot

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

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

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:10)

最方便的方法是创建一个轴手柄数组,然后设置属性:

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');

从那时起,它又是对setaxis的一次调用,例如

set(axesHandles,'color','k','lineWidth',2)
axis(axesHandles,'tight')

答案 1 :(得分: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