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

标签 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

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

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

The result:

请注意,轴/子列表是颠倒的(因此使用了 flipud 函数),但如果将其放入循环中,则可以向后运行循环。


编辑

如果您要丢弃原始图形(f1f2),那么您也可以通过分配 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/

相关文章:

matlab - 重新定位颜色条或子图

java - 如何在Mac 10.9.4(其实就是Mac虚拟机)上安装Matlab R2014a?

python - MATLAB 和 Python 之间的不同频谱图

python - 如何在 matplotlib 中使轴透明?

arrays - 在 MATLAB 中使用 Line 函数在数组中循环使用不同的颜色

MATLAB pcolor/surf 双线性插值(着色插值)

image - 根据图像插值函数

matlab - randperm() 可以生成多个随机排列吗?

r - 如何为曲线包络着色

matlab - 删除对象句柄并保留 MATLAB 中的变量