如何使用 python/matplotlib 为 3d 绘图设置“相机位置”?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/12904912/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
how to set "camera position" for 3d plots using python/matplotlib?
提问by Andreas Bleuler
I'm learning how to use mplot3d to produce nice plots of 3d data and I'm pretty happy so far. What I am trying to do at the moment is a little animation of a rotating surface. For that purpose, I need to set a camera position for the 3D projection. I guess this must be possible since a surface can be rotated using the mouse when using matplotlib interactively. But how can I do this from a script? I found a lot of transforms in mpl_toolkits.mplot3d.proj3d but I could not find out how to use these for my purpose and I didn't find any example for what I'm trying to do.
我正在学习如何使用 mplot3d 生成漂亮的 3d 数据图,到目前为止我很高兴。我现在想做的是一个旋转表面的小动画。为此,我需要为 3D 投影设置相机位置。我想这一定是可能的,因为在交互使用 matplotlib 时可以使用鼠标旋转表面。但是我怎么能从脚本中做到这一点呢?我在 mpl_toolkits.mplot3d.proj3d 中发现了很多转换,但我不知道如何将这些用于我的目的,我也没有找到任何我想要做的例子。
采纳答案by cosmosis
By "camera position," it sounds like you want to adjust the elevation and the azimuth angle that you use to view the 3D plot. You can set this with ax.view_init. I've used the below script to first create the plot, then I determined a good elevation, or elev, from which to view my plot. I then adjusted the azimuth angle, or azim, to vary the full 360deg around my plot, saving the figure at each instance (and noting which azimuth angle as I saved the plot). For a more complicated camera pan, you can adjust both the elevation and angle to achieve the desired effect.
通过“相机位置”,听起来您想要调整用于查看 3D 绘图的仰角和方位角。您可以使用ax.view_init. 我使用下面的脚本首先创建了绘图,然后我确定了一个好的高程,或者elev,从中可以查看我的绘图。然后我调整了方位角,或者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)
回答by user1469620
What would be handy would be to apply the Camera position to a new plot. So I plot, then move the plot around with the mouse changing the distance. Then try to replicate the view including the distance on another plot. I find that axx.ax.get_axes() gets me an object with the old .azim and .elev.
将相机位置应用于新图会很方便。所以我绘图,然后用鼠标改变距离来移动绘图。然后尝试在另一个图上复制包含距离的视图。我发现 axx.ax.get_axes() 为我提供了一个带有旧 .azim 和 .elev 的对象。
IN PYTHON...
在 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
Later 3d graph...
后来的3d图...
ax2.view_init(elev=ele, azim=azm) #Works!
ax2.dist=dst # works but always 10 from axx
EDIT 1... OK, Camera position is the wrong way of thinking concerning the .dist value. It rides on top of everything as a kind of hackey scalar multiplier for the whole graph.
编辑 1... 好的,相机位置是关于 .dist 值的错误思考方式。它作为整个图的一种hackey标量乘法器位于一切之上。
This works for the magnification/zoom of the view:
这适用于视图的放大/缩放:
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
Later Graph...
后来图...
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]) #...

