我想创建一个图形,一旦创建了子图,我想同时将属性应用于所有这些,而无需通过 for 循环。事实上,我想在不需要通过 for 循环的情况下执行以下所有操作:
- 创建没有 for 循环的所有子图。(例如,创建一个带有 4x5 子图的图形,而不是使用 for 循环)。
- 将相同的背景颜色应用于每个带有 oa 循环的子图。
- 将相同的轴命令应用于所有这些 w/oa for-loop。(如轴相等,轴紧等)。
有没有办法做到这一点?
我想创建一个图形,一旦创建了子图,我想同时将属性应用于所有这些,而无需通过 for 循环。事实上,我想在不需要通过 for 循环的情况下执行以下所有操作:
有没有办法做到这一点?
最方便的方法是创建一个坐标区句柄数组,然后设置属性:
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')
我不明白为什么你认为那个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