图中的重复轴

问题描述 投票:1回答:1

抱歉有点简单的问题。我试图生成一个显示相同动画但在不同子图中的图形。我开始简单,主要关注首先复制情节。

我原本打算将子图的句柄附加到其他图上

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个子图,但是它是否会传播到其他子图?

matlab matlab-figure subplot
1个回答
1
投票

这实际上取决于你最终想做什么,动画有多复杂,以及你是否可以提前准备你的情节。

首先,如果只有少数对象,可以使用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中。

© www.soinside.com 2019 - 2024. All rights reserved.