如何在保留所有属性的同时在一系列子图中排列多个图形?

时间:2014-09-25 18:53:41

标签: matlab plot matlab-figure

想象一下,我有函数myPlot创建一个简单的图并返回图形和轴句柄:

function [ fig_handle, axes_handle ] = myPlot( myTitle )

x = linspace(-10,10,100);
y = x.^2;

fig_handle = figure;
plot(x,y,'Color','b')
ylim([0,42]); xlim([-42/10,42/10]);
ylabel('y'); xlabel('x');
title(myTitle);
grid on;
axes_handle = gca;

end

现在我想用不同的输入参数多次调用该函数,并将它们连接成一个子图数组。我想出的解决方案是

[f1,a1] = myPlot('Plot #1');
[f2,a2] = myPlot('Plot #2');

figure(3)
s221 = subplot(211);
s222 = subplot(212);
copyobj(get(a1,'children'),s221)
copyobj(get(a2,'children'),s222)

它给了我

enter image description here

所以新的2部分图不会保留两个图的任何属性。当然我知道我可以这样做:

set(s221,'Ylabel',get(a1,'Ylabel')) 

包含所有属性。但我尽量避免这种情况。我不知道有什么比这更容易了吗?

2 个答案:

答案 0 :(得分:4)

另一种解决方法是将整个轴对象(所有属性都会出现)复制到一个新图中。您自己设置的唯一属性是根据子图(xyz)规则的位置。

从你的例子开始:

[f1,a1] = myPlot('Plot #1');
[f2,a2] = myPlot('Plot #2');

然后将每个图的轴复制到新图中

h4 = figure(4)
copyobj(get(f1,'children'),h4)
copyobj(get(f2,'children'),h4)

他们都在这里,但他们仍然是叠加的。你现在必须重新定位它们。


为了快速解决方法,我使用中间数字让subplot为我计算位置,但这些位置(轴排列)可能由你自己用辅助函数计算(从{{1}中翻录一些代码如果你需要的话。)

subplot.m

然后我将位置应用于图中的轴:

%// Just to get some position calculated for me
figure(3)
s221 = subplot(211);
s222 = subplot(212);

The result:

请注意,轴/子列表是颠倒的(因此使用hl = flipud( get(h4,'Children') ) ; set( hl(1),'Position', get(s221,'Position') ) set( hl(2),'Position', get(s222,'Position') ) 函数),但如果将其放在循环中,则可以向后运行循环。


修改

如果您要丢弃原始图形(flipudf1),那么您也可以通过指定{{1来简单地将轴移动到新图形(而不是复制它们)。 f2的属性,然后关闭图(以保持整洁)。只需使用:

Parent

而不是axes的2行。其余解决方案完全相同。不确定是否通过移动对象而不是复制它来获得性能提升( Matlab可能会在后台进行复制......或者不是)但是如果它涉及许多具有大量数据集的数字至少可以在此过程中节省一些记忆。

答案 1 :(得分:1)

一种可能的解决方法可能是以下,但不是真正的通用。会对解决原始问题的解决方案感兴趣。

如果可以修改myPlot函数,可以通过图形句柄和子图说明符,并从头开始正确绘制所有内容。

function [ fig_handle, axes_handle ] = myPlot(fig_handle, sub, myTitle )

figure(fig_handle); subplot(sub)

....

end

通过

调用
f = figure(3);
[f,a1] = myPlot(f, 221,'Plot #1');
[f,a2] = myPlot(f, 222,'Plot #2');