如何使用 python/matplotlib 为 3d 图设置“相机位置”?

新手上路,请多包涵

我正在学习如何使用 mplot3d 生成漂亮的 3d 数据图,到目前为止我很高兴。我现在想做的是一个旋转表面的小动画。为此,我需要为 3D 投影设置相机位置。我想这一定是可能的,因为在交互使用 matplotlib 时可以使用鼠标旋转表面。但是我怎样才能从脚本中做到这一点呢?我在 mpl_toolkits.mplot3d.proj3d 中发现了很多转换,但我无法找到如何将它们用于我的目的,而且我没有找到我正在尝试做的事情的任何示例。

原文由 Andreas Bleuler 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 816
2 个回答

通过“相机位置”,听起来您想调整用于查看 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)

原文由 cosmosis 发布,翻译遵循 CC BY-SA 4.0 许可协议

将相机位置应用于新绘图会很方便。所以我画图,然后用鼠标改变距离移动图。然后尝试复制视图,包括另一个图上的距离。我发现 axx.ax.get_axes() 为我提供了一个带有旧 .azim 和 .elev 的对象。

在蟒蛇…

 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 值的错误思考方式。它作为整个图形的一种 hackkey 标量乘数,凌驾于一切之上。

这适用于视图的放大/缩放:

 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])     #...

原文由 snaxxus 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题