Как я могу переместить несколько существующих графиков в один подзаговор в MATLAB?

У меня есть функция myFunkyFigure, которая принимает данные, выполняет некоторые фанковые вещи и возвращает объект оси для фигуры, которую он создает.

Я хотел бы иметь возможность дважды вызвать эту функцию, создав две разные цифры:

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

Затем я хотел бы добавить их в подзаголовок вместе.

Обратите внимание, что из-за funkiness myFunkyFigure, следующее не работает.

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

Я считаю, что мне что-то нужно в строках copyobj, но я не смог заставить это работать (я попытался выполнить решение в вопросе. а затем объединить их в фигуру позже в MATLAB, но безрезультатно).

Ответы

Ответ 1

Очевидно, мы не знаем, как "фанки" ваши цифры, но в этом случае следует отметить, что самым чистым решением было бы изменить функцию myFunkyFigure таким образом, чтобы она принимала дополнительные необязательные аргументы, в частности дескриптор осей, в который можно разместить созданный сюжет. Тогда вы будете использовать его так:

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 (т.е. никаких дополнительных аргументов) было бы создать его собственную фигуру и разместить там график.

Однако, чтобы ответить на вопрос, который вы задали, вот способ выполнить это, учитывая, что вы выводите дескрипторы оси (а не фигурные ручки) в вектор fig ( note:, это в основном то же самое решение, что и в другом вопросе, но, поскольку вы упоминаете, что не можете его адаптировать, я решил переформатировать его, чтобы лучше соответствовать вашей конкретной ситуации):

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)

Вышеупомянутое фактически переместит оси с старого рисунка на новый. Если вы хотите, чтобы объект осей отображался на обеих фигурах, вы можете вместо этого использовать функцию COPYOBJ:

hNew = copyobj(fig(1),hFigure);  %# Copy fig(1) to hFigure, making a new handle
set(hNew,'Position',newPos);     %# Modify its position

Также обратите внимание, что SUBPLOT используется здесь только для создания позиции для разбиения осей. Вы могли бы избежать необходимости создавать, а затем удалять подсети, указав сами позиции.

Ответ 2

Код от gnovice не работал у меня.

Казалось, что фигуру нельзя сделать ребенком другой фигуры. Например hNew = copyobj (fig (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

Кажется, это работает для меня.