假设我有函数 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)
它给了我
所以新的两部分图不保留之前两个图的任何属性。我当然知道我可以这样做:
set(s221,'Ylabel',get(a1,'Ylabel'))
具有所有属性。但我尽量避免这种情况。有什么我想念的更容易吗?
最佳答案
另一种解决方法是将完整的坐标区对象(所有属性都随之而来)复制到新图形中。您唯一可以自己设置的属性是根据 subplot(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
为我计算位置,但这些位置(轴排列)可能可以由您自己使用辅助函数计算(如果需要,可以从 subplot.m
中提取一些代码)。
%// Just to get some position calculated for me
figure(3)
s221 = subplot(211);
s222 = subplot(212);
然后我将位置应用于图中的轴:
hl = flipud( get(h4,'Children') ) ;
set( hl(1),'Position', get(s221,'Position') )
set( hl(2),'Position', get(s222,'Position') )
请注意,轴/子列表是颠倒的(因此使用了 flipud
函数),但如果将其放入循环中,则可以向后运行循环。
编辑
如果您要丢弃原始图形(f1
和 f2
),那么您也可以通过分配 Parent
将坐标轴简单地移动到新图形(而不是复制它们) axes
的属性(property),然后关闭图形(以保持整洁)。只需使用:
set(a1,'Parent',h4) ; close(f1)
set(a2,'Parent',h4) ; close(f2)
而不是带有 copyobj
的 2 行.解决方案的其余部分是相同的。不确定通过移动对象而不是复制它是否可以提高性能(Matlab 无论如何都可能在后台进行复制......或不)但是如果它涉及许多具有大量数据集的图形它至少可以在这个过程中节省一些内存。
关于matlab - 如何在保留所有属性的同时在子图中排列多个图形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26046010/