MATLAB:立即设置和强制执行轴属性

时间:2014-10-13 19:33:05

标签: matlab plot

我的可视化代码如下:

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时它才有效。这导致整个子图被渲染,然后明显地反转。

是否有一种方法可以在计算/渲染任何包含的未来对象之前设置和强制执行此属性,以便所有内容在第一个位置沿指定轴反转显示?

我还欢迎提高我对holddrawnow的使用的建议,以及如何为开头本身的所有子图设置和强制执行轴反转(或一般的任何轴属性)如果可能的话,只需拨打set一次。

1 个答案:

答案 0 :(得分:2)

在创建一些样本数据之后,似乎对scatter3的调用是将轴反转回原始值(如果之前设置了'ZDir')。

当我创建复杂的图形时我经常做什么,而且我不希望高级绘图功能弄乱我的布局:

1)将图形对象设为空(如果可以,则使用低级功能)
2)设置所有轴属性
3)使用XData更新图形对象的YDataZData(和相似的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的多次调用,除非你做了很多事情并且需要定期刷新事件队列,我认为大部分都是不必要的(许多图形调用也会更新)这个数字本身)。首先尝试不使用它们,如果您真的需要在代码的某个阶段进行图形更新,那么您可以使用它们(您可能还需要在程序中暂停,否则您可能没有时间看到差异)。