如何在MATLAB中将几个现有图移动到一个子图?

时间:2011-04-27 17:05:11

标签: matlab plot

我有一个函数myFunkyFigure,它接收数据,做一些时髦的事情,并为它产生的数字返回一个轴对象。

我希望能够两次调用此函数,创建两个不同的数字:

fig(1) = myFunkyFigure(dataSet1);
fig(2) = myFunkyFigure(dataSet2);

然后我想把它们放在一个子图中。

请注意,由于myFunkyFigure的嗜好,以下内容无效。

subplot(2,1,1);
myFunkyFigure(dataSet1);
subplot(2,1,2);
myFunkyFigure(dataSet2);

我相信我需要copyobj的某些内容,但我无法让它发挥作用(我尝试了a solution in Stack Overflow question Producing subplots and then combine them into a figure later in MATLAB,但无济于事。)

2 个答案:

答案 0 :(得分:11)

显然,我们不知道你的数字是多么“时髦”,但在这种情况下应该注意,最干净的解决方案是修改函数myFunkyFigure,使其接受additional optional arguments },特别是放置其创建的图的轴的手柄。那你就像这样使用它:

hSub1 = subplot(2,1,1);         %# Create a subplot
myFunkyFigure(dataSet1,hSub1);  %# Add a funky plot to the subplot axes
hSub2 = subplot(2,1,2);         %# Create a second subplot
myFunkyFigure(dataSet2,hSub2);  %# Add a funky plot to the second subplot axes

myFunkyFigure的默认行为(即没有指定其他参数)将创建自己的图并将图放在那里。

但是,要回答你问的问题,这里有一种方法可以实现这一点,因为你在向量中输出轴句柄(而不是图形句柄){ {1}}(注意:这基本上是the same solution as the one given in the other question,但是由于您提到无法适应它,我认为我会重新格式化以更好地适应您的具体情况):

fig

以上实际上轴从旧图移动到新图。如果您希望轴对象出现在两个图中,您可以改为使用函数COPYOBJ,如下所示:

hFigure = figure();                              %# Create a new figure
hTemp = subplot(2,1,1,'Parent',hFigure);         %# Create a temporary subplot
newPos = get(hTemp,'Position');                  %# Get its position
delete(hTemp);                                   %# Delete the subplot
set(fig(1),'Parent',hFigure,'Position',newPos);  %# Move axes to the new figure
                                                 %#   and modify its position
hTemp = subplot(2,1,2,'Parent',hFigure);         %# Make a new temporary subplot
%# ...repeat the above for fig(2)

另请注意,SUBPLOT仅用于生成轴平铺的位置。您可以通过自己指定位置来避免创建然后删除子图的需要。

答案 1 :(得分:2)

gnovice的代码对我不起作用。

似乎一个人物无法成为另一个人物的孩子。例如,hNew = copyobj(图(1),hFigure);给出了错误

Error using copyobj
Object figure[1] can not be a child of parent
figure[1]
相反,我不得不让新人的轴线成为孩子。这是我提出的功能

function []= move_to_subplots(ax,a,b)
%     %
% Inputs:
%       inputname: 
% Outputs:
%       name:  description type units
%       saved data: (does this overwrite a statically named file?)
%       plots:
%
% Standard call:
%
%
% Written by C. Hogg Date 2012_06_01
%
% 
debugmode=0;

hFigure=figure();

if ~exist('a')
        a=ceil(sqrt(length(ax)));
end

if ~exist('b')
        b=1;
    end    

if a*b<length(ax)|~exist('a')|~exist('b')
    disp('Auto subplot sizing')

    b=ceil(length(ax)/a);
end

for i=1:length(ax)

hTemp = subplot(a,b,i,'Parent',hFigure);         %# Make a new temporary subplot
newPos = get(hTemp,'Position');                  %# Get its position
delete(hTemp);

hNew = copyobj(ax(i),hFigure);
set(hNew,'Position',newPos)
end

%% Debug. Break point here.
if debugmode==1; dbstop tic; tic; dbclear all;end

end

这似乎对我有用。