Как я могу переместить несколько существующих участков в один участок в MATLAB? - PullRequest
15 голосов
/ 27 апреля 2011

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

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

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

Тогда я бы хотел собрать их вместе.

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

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

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

Ответы [ 2 ]

11 голосов
/ 27 апреля 2011

Очевидно, мы не знаем, насколько «прикольны» ваши цифры, но следует отметить, что в таком случае самым чистым решением было бы модифицировать функцию 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 ( примечание: это в основном то же самое решение, которое было дано в другом вопросе , но, поскольку вы упомянули о проблемах с адаптацией, я решил переформатировать его, чтобы лучше соответствовать вашей конкретной ситуации):

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 голосов
/ 20 июля 2012

Код от 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

Мне кажется, это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...