Matlab 在图形中复制轴

Matlab 在图形中复制轴,matlab,matlab-figure,subplot,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

很抱歉问了一个简单的问题。我试图生成一个人物,它显示相同的动画,但在不同的子情节。我从简单开始,主要关注的是先复制情节

我最初想把子地块的句柄附加到其他地块上

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]);

但这只是移动现有的绘图,而不是复制它。(因为我仍然指同一个对象,尽管它有不同的名称)

我下一步考虑的是只重新创建相同的设置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]);


有没有办法调用1个子地块,更新1个子地块,但将其传播到其他子地块?

这取决于最终要做什么,动画有多复杂,以及是否可以提前准备绘图

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

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

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

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

最后,它可以是一个选项,用于仅捕获渲染图像并将其显示在副本
轴中

,您能否详细解释一下最后要执行的操作?想必,您不希望得到三个完全相同的子地块,但会有一些差异。它们将是什么?实际上,我正在尝试制作3个相同的子情节,因为我想在3个单独的区域中显示相同的动画。我使用的投影仪的投掷范围为60厘米,理想情况下,我将有3个子地块在10厘米,30厘米,50厘米。谢谢你的回答,快速问题。当我使用“copyobj”时,该函数会创建一个全新的轴,然后我必须重新定位该轴。是否可以使用“copyobj”将对象复制到现有轴中?我有一个已经创建了轴的图形,我计划在开始动画之前用对象填充轴。如果我可以复制到现有的轴,那么它将非常适合我当前的设置。@Hojo.Timberwolf第二个示例正好显示:复制
子对象
。您可以调整它以复制循环和链接属性之前的子对象,如第一个示例所示