我的可视化代码如下:
scatter3(N(:,1), N(:,2), N(:,3), '.');
drawnow;
hold on;
for r = 1 : NUM
% ... heavy calculations here
trisurf(Tri(FBtri), XYZ(:,1), XYZ(:,2), XYZ(:,3));
drawnow;
hold on;
end
set(gca, 'ZDir', 'reverse');
我需要反转Z轴,并且发现只有在每个子图的整个代码块之后添加属性setter时它才有效。这导致整个子图被渲染,然后明显地反转。
是否有一种方法可以在计算/渲染任何包含的未来对象之前设置和强制执行此属性,以便所有内容在第一个位置沿指定轴反转显示?
我还欢迎提高我对hold
和drawnow
的使用的建议,以及如何为开头本身的所有子图设置和强制执行轴反转(或一般的任何轴属性)如果可能的话,只需拨打set
一次。
答案 0 :(得分:2)
在创建一些样本数据之后,似乎对scatter3
的调用是将轴反转回原始值(如果之前设置了'ZDir')。
当我创建复杂的图形时我经常做什么,而且我不希望高级绘图功能弄乱我的布局:
1)将图形对象设为空(如果可以,则使用低级功能)
2)设置所有轴属性
3)使用XData
更新图形对象的YData
,ZData
(和相似的set
(对set
的调用不会修改任何其他内容)关于图/轴属性。
在您的情况下,使用我必须创建的示例数据,似乎可以正常工作:
h.ax = axes( 'ZDir', 'reverse' , 'NextPlot','add') ;
h.hs3 = scatter3([],[],[],'.','Parent',h.ax) ;
set( h.hs3 , 'XData',N(:,1) , 'YData',N(:,2) , 'ZData',N(:,3) ) ;
for r = 1 : NUM
% ... heavy calculations here
h.t(r) = trisurf(Tri(FBtri), XYZ(:,1), XYZ(:,2), XYZ(:,3)) ;
end
轴定义中的'Nextplot','add'
属性相当于hold on
,因此您无需在每个绘图指令后调用它
请注意,在您的情况下,您似乎没有使用scatter3
的完整功能(您没有为每个点指定大小),因此您可以通过简单地使用来加快速度并简化图形执行一个line
对象:
h.hs3 = line('XData',N(:,1) , 'YData',N(:,2) , 'ZData',N(:,3) , 'Parent',h.ax,'Marker','.','Linestyle','none') ;
这可以取代我上面给出的代码的第2行和第3行
line
对象只是3D中的一系列数据点(与名称相反,您不必按实际行链接),而scatter3
函数创建patch
每个数据点的对象(更多图形密集,如果不使用它们会浪费资源)。
调用line
也是我上面提到的低级别功能的一个例子。当你调用plot
时,它只是一个包装器,它创建一个line
对象,并在场景后面做其他事情。创建line
对象可以为您提供更多控制,但有时会强制您使用更多初始属性调用它们。例如,scatter3
后面的低级对象是specgraph.scattergroup
,最初设置起来可能有点棘手,所以找到你的舒适程度。
至于对drawnow
的多次调用,除非你做了很多事情并且需要定期刷新事件队列,我认为大部分都是不必要的(许多图形调用也会更新)这个数字本身)。首先尝试不使用它们,如果您真的需要在代码的某个阶段进行图形更新,那么您可以使用它们(您可能还需要在程序中暂停,否则您可能没有时间看到差异)。