在 Matplotlib 3D 图中获取视角/相机角度?

Posted

技术标签:

【中文标题】在 Matplotlib 3D 图中获取视角/相机角度?【英文标题】:Get viewing/camera angles in Matplotlib 3D plot? 【发布时间】:2018-05-16 13:48:59 【问题描述】:

当我用鼠标旋转 Matplotlib 3D 图时,如何保存视角/相机位置,并在下次运行脚本时使用这些值以编程方式设置视角?

【问题讨论】:

This answer 展示了如何在两个绘图之间同步相机位置。您可以使用它而不是同步,只需将azimelev 打印到控制台即可。 【参考方案1】:

TL;DR

视角存储在图形的轴对象中,名称为elevazim,可以使用plt.gca().view_init(elev, azim)设置视图。

详细的答案和例子

导入库并生成要绘制的数据:

import matplotlib as mpl  # noqa
from mpl_toolkits.mplot3d import Axes3D  # noqa
import matplotlib.pyplot as plt
import numpy as np
mpl.style.use('seaborn')

np.random.seed(11)
n = 200
x = y = np.linspace(-10, 10, n)
z = np.random.randn(n)*3 + 2

现在绘制数据:

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')

我们展示情节并调整视角,直到它看起来不错。 一旦我们关闭它,就会打印出仰角和方位角变量。

plt.show()

print('ax.azim '.format(ax.azim))
print('ax.elev '.format(ax.elev))

获得这些值后,您可以使用

以编程方式设置视角
ax.view_init(elev, azim)

示例图 - 调整到 ax.azim = -164.5 和 ax.elev = 51.25 之前和之后。


另外,这里有一个完整的脚本,如果你想尝试一下,可以复制粘贴到:

#!/usr/bin/env pythonw
import matplotlib as mpl  # noqa
from mpl_toolkits.mplot3d import Axes3D  # noqa
import matplotlib.pyplot as plt
import numpy as np
mpl.style.use('seaborn')


# ****************************************************************************
# *                               Create data                                *
# ****************************************************************************
np.random.seed(11)
n = 200
x = y = np.linspace(-10, 10, n)
z = np.random.randn(n)*3 + 2


# ****************************************************************************
# *                                 Plot data                                *
# ****************************************************************************
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')

# # If we knew what angles we wanted to set, these lines will set it
# elev = 42.0
# azim = 105.5
# ax.view_init(elev, azim)

# Show the figure, adjust it with the mouse
plt.show()

# Once the figure is closed, the azimutal angle and the elevation will
# be printed. They may be used as input for ax.view_init(elev, azim)
print('ax.azim '.format(ax.azim))
print('ax.elev '.format(ax.elev))

【讨论】:

以上是关于在 Matplotlib 3D 图中获取视角/相机角度?的主要内容,如果未能解决你的问题,请参考以下文章

ActionScript 3 Papervision3D - 相机视角变化

unity3d 第三人称视角的人物移动以及相机控制

Unity 知识点 - 3D游戏 - 视角跟随和键盘移动

带有颜色渐变的 Matplotlib 3D 散点图

尝试将 3d 子图添加到 matplotlib 图

matplotlib 3D 轮廓标签