2012-10-15 73 views
85

我正在学习如何使用mplot3d生成3D数据的美妙情节,到目前为止我非常高兴。我现在想做的是旋转表面的一点动画。为此,我需要为3D投影设置相机位置。我想这一定是可能的,因为交互式使用matplotlib时可以使用鼠标旋转曲面。但是我怎么能从脚本中做到这一点? 我在mpl_toolkits.mplot3d.proj3d中发现了很多变换,但我无法找到如何使用这些用于我的目的,我没有找到任何我想要做的示例。如何使用python/matplotlib设置3d图的“摄像头位置”?

+0

旁注为那些不知道如何在jupyter笔记本交互旋转:您可以使用'%matplotlib笔记本' – YvesgereY

回答

103

通过“摄像头位置”,听起来您想要调整用于查看3D图的高程和方位角。我已经使用了下面的脚本来创建剧情,然后我确定了一个很好的海拔,或者从中查看我的剧情。然后我调整了方位角或azim,以改变我的地块周围的全部360度,在每个实例处保存图(并且注意到我保存该图的方位角)。对于更复杂的摄像机平移,您可以调整高程和角度以达到所需的效果。

from mpl_toolkits.mplot3d import Axes3D 
    ax = Axes3D(fig) 
    ax.scatter(xx,yy,zz, marker='o', s=20, c="goldenrod", alpha=0.6) 
    for ii in xrange(0,360,1): 
     ax.view_init(elev=10., azim=ii) 
     savefig("movie%d.png" % ii) 
+17

打我吧!在附注中,这些可以用作'ax.elev'和'ax.azim'属性。你也可以写下'ax.azim = ii'或甚至'ax.azim + = 1'来达到同样的效果。 –

+0

抱歉,我击败了你,但公平点四周。这也仅仅是我的代码片段,在for循环中比view_init和savefig更多。 =) – cosmosis

+2

感谢cosmosis和乔,那正是我一直在寻找的。由于我现在知道要寻找什么,我还发现ax.dist与ax.azim和ax.elev一起允许在极坐标中设置相机位置。 –

9

将相机位置应用到新的情节会是多么方便。 所以我绘制,然后用鼠标移动阴谋改变距离。然后尝试复制包含另一个图上距离的视图。 我发现axx.ax.get_axes()使用旧的.azim和.elev得到了一个对象。

在Python ...

axx=ax1.get_axes() 
azm=axx.azim 
ele=axx.elev 
dst=axx.dist  # ALWAYS GIVES 10 
#dst=ax1.axes.dist # ALWAYS GIVES 10 
#dst=ax1.dist  # ALWAYS GIVES 10 

后来3D图形...

ax2.view_init(elev=ele, azim=azm) #Works! 
ax2.dist=dst      # works but always 10 from axx 

编辑1 ... OK,摄像头位置的思维有关.dist值走错了路。它作为整个图形的一种hackey标量乘法器,在所有方面都占据首位。视图的

这适用于放大/缩小:

xlm=ax1.get_xlim3d() #These are two tupples 
ylm=ax1.get_ylim3d() #we use them in the next 
zlm=ax1.get_zlim3d() #graph to reproduce the magnification from mousing 
axx=ax1.get_axes() 
azm=axx.azim 
ele=axx.elev 

后来曲线图...

ax2.view_init(elev=ele, azim=azm) #Reproduce view 
ax2.set_xlim3d(xlm[0],xlm[1])  #Reproduce magnification 
ax2.set_ylim3d(ylm[0],ylm[1])  #... 
ax2.set_zlim3d(zlm[0],zlm[1])  #... 
+0

+1用于调出哈克标量乘法。如果你希望透视,这是非常烦人的。 – user5920660

相关问题