дублирующие оси в фигуре - PullRequest
0 голосов
/ 07 сентября 2018

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

Первоначально я думал о том, чтобы прикрепить ручку для подзаговора к другим участкам

afig = figure;
a1{1} = axes('Position',[.01,.2,.2,.2], 'color','none','Xlim',[-10,10],'Ylim',[-10,10]);
a1{2} = a1{1};
a1{2}.Position = [.3,.2,.2,.2];
a1{3} = a1{1};
a1{3}.Position = [.6,.2,.2,.2];

obj = patch('Parent',a1{1},'XData',[1,3,1],'YData',[1,1,3]);

enter image description here

Но это просто перемещает существующий сюжет, а не дублирует его. (из-за того, что я все еще ссылаюсь на один и тот же объект, даже если у него разные имена)

Затем я подумал о том, чтобы просто воссоздать одну и ту же настройку 3 раза, а затем обновить анимацию, повторяя все три, но это кажется неэффективным и требующим значительных вычислительных ресурсов.

afig = figure;
a1{1} = axes('Position',[.01,.2,.2,.2], 'color','none','Xlim',[-10,10],'Ylim',[-10,10]);
a1{2} = axes('Position',[.3,.2,.2,.2], 'color','none','Xlim',[-10,10],'Ylim',[-10,10]);
a1{3} = axes('Position',[.6,.2,.2,.2], 'color','none','Xlim',[-10,10],'Ylim',[-10,10]);

obj{1} = patch('Parent',a1{1},'XData',[1,3,1],'YData',[1,1,3]);
obj{2} = patch('Parent',a1{2},'XData',[1,3,1],'YData',[1,1,3]);
obj{3} = patch('Parent',a1{3},'XData',[1,3,1],'YData',[1,1,3]);

enter image description here

Есть ли способ вызвать 1 субплот, обновить этот 1 субплот, но распространить его на другие субплоты?

1 Ответ

0 голосов
/ 07 сентября 2018

Это действительно зависит от того, что вы хотите сделать в конце, от того, насколько сложна анимация, и от того, сможете ли вы подготовить свои сюжеты заранее.

Во-первых, если объектов всего несколько, вы можете использовать функцию linkprop для связи свойств графических объектов:

afig = figure;
a1{1} = axes('Position',[.01,.2,.2,.2], 'color','none','Xlim',[-10,10],'Ylim',[-10,10]);
obj = patch('Parent',a1{1},'XData',[1,3,1],'YData',[1,1,3]);

a1{2} = copyobj(a1{1}, afig);
a1{2}.Position = [.3,.2,.2,.2];

a1{3} = copyobj(a1{1}, afig);
a1{3}.Position = [.6,.2,.2,.2];


linked_objects = [ a1{1}.Children, a1{2}.Children,  a1{3}.Children];
property_names = {'XData', 'YData', 'ZData'};

hlink = linkprop(linked_objects, property_names);


for ii = 1:10
    obj.XData(1) = ii;
    drawnow
    pause(0.01)
end

Здесь мы сначала создаем базовый график, затем копируем axes (обратите внимание, что копируются и дочерние объекты, но не обратные вызовы и другие свойства, см. copyboy). Затем мы связываем свойства, которые мы можем захотеть изменить во время анимации (обратите внимание, что вы также можете связать свойства вида axes '), а затем измените их в цикле.

Другой подход заключается в изменении свойств объекта в главном axes на каждой итерации цикла и последующем копировании основных axes 'потомков в другой axes. Этот подход может быть более дорогостоящим - поскольку многие объекты копируются и отображаются - но, с другой стороны, не нужно отслеживать отдельные свойства. Вот пример:

afig = figure;

a1{1} = axes('Position',[.01,.2,.2,.2], 'color','none','Xlim',[-10,10],'Ylim',[-10,10]);
obj = patch('Parent',a1{1},'XData',[1,3,1],'YData',[1,1,3]);

a1{2} = copyobj(a1{1}, afig);
a1{2}.Position = [.3,.2,.2,.2];

a1{3} = copyobj(a1{1}, afig);
a1{3}.Position = [.6,.2,.2,.2];

for ii = 1:10

    obj.XData(1) = ii;

    delete(a1{2}.Children);
    delete(a1{3}.Children);
    copyobj(a1{1}.Children, a1{2});
    copyobj(a1{1}.Children, a1{3});

    drawnow
    pause(0.01)
end

Наконец, можно использовать getframe, чтобы просто захватить визуализированное изображение и отобразить его в копии axes.

...