我有一个函数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,但无济于事。)
答案 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
这似乎对我有用。