如何使用python / matplotlib设置3D图的“相机位置”?
我正在学习如何使用mplot3d来生成3D数据的精美graphics,到目前为止我非常开心。 目前我正在做的是一个旋转表面的小animation。 为此,我需要为3D投影设置相机位置。 我想这一定是可能的,因为当交互使用matplotlib时,可以使用鼠标旋转曲面。 但是,我怎样才能从脚本中做到这一点? 我在mpl_toolkits.mplot3d.proj3d中发现了很多转换,但我找不到如何使用这些用于我的目的,我没有find我想要做的任何示例。
通过“相机位置”,听起来您想要调整用于查看3D图的高程和方位angular。 我已经使用了下面的脚本来创build剧情,然后我确定了一个很好的高度或者高度,从中查看我的情节。 然后我调整了方位angular或方位angular,在我的地块周围改变了360度的全angular,在每个实例中保存了这个数字(并且注意到我保存了该图的方位angular)。 对于更复杂的摄像机平移,您可以调整高程和angular度以达到所需的效果。
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)
将相机位置应用到新的情节将是方便的。 所以我绘制,然后用鼠标移动阴谋改变距离。 然后尝试在另一个图上复制包括距离的视图。 我发现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 …好吧,相机位置是关于.dist值的错误思维方式。 它作为整个graphics中的一种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]) #...