图中的重复轴
duplicate axes in a figure
抱歉,问题有点简单。我正在尝试生成一个显示相同动画但在不同子图中的图形。我从简单开始,主要专注于首先复制情节。
我本来想把子图的句柄附加到其他图上
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 个子图,但让它传播到其他子图?
这真的取决于你最后想做什么,动画有多复杂,以及你是否可以提前准备你的情节。
首先,如果只有几个对象,可以使用linkprop
函数来link图形对象的属性:
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
)。然后我们 link 我们可能想要在动画期间更改的属性(请注意,您也可以 link 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
。
抱歉,问题有点简单。我正在尝试生成一个显示相同动画但在不同子图中的图形。我从简单开始,主要专注于首先复制情节。
我本来想把子图的句柄附加到其他图上
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 个子图,但让它传播到其他子图?
这真的取决于你最后想做什么,动画有多复杂,以及你是否可以提前准备你的情节。
首先,如果只有几个对象,可以使用linkprop
函数来link图形对象的属性:
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
)。然后我们 link 我们可能想要在动画期间更改的属性(请注意,您也可以 link 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
。