图中的重复轴

时间:2018-09-07 07:40:50

标签: matlab matlab-figure subplot

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

我原本是想将子图的句柄附加到其他图上

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次,然后更新动画,循环遍历这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 :(得分:1)

这实际上取决于您最终想要做什么,动画的复杂程度以及是否可以提前准备绘图。

首先,如果只有几个对象,则可以使用linkprop函数来链接图形对象的属性:

./aimk -no-java -no-jni -no-secure -spool-classic -no-dump depend

在这里,我们首先创建基本图,然后复制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 (请注意,子对象也被复制,但没有回调和其他属性,请参见copyboy)。然后,我们链接我们可能要在动画过程中更改的属性(请注意,您也可以链接axes'的视图属性),然后循环更改它们。

另一种方法是在每次循环迭代中更改主axes中对象的属性,然后将主axes的孩子复制到其他axes中。这种方法的成本可能更高(因为许多对象被复制和渲染),但另一方面,不必跟踪单个属性。这是一个示例:

axes

最后,可以选择使用getframe仅捕获渲染的图像并将其显示在副本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 中。