我只是在学习Matplotlib,所以我直接去立体可视化。我已经建立了镜子来查看屏幕,并且有左和右的数字交互更新正确的距离。
我现在需要做的是询问一个轴的方向,以设置另一个轴的方向。我已经RFTM'd,并做了帮助(Axes3D.function),不幸的是文档似乎有点单薄,不一致。
到目前为止,我发现唯一的Axes3D调用设置/获取观看方向是view_init(azim=, elev=)和get_proj(),它返回一个4x4变换矩阵。
现在get_proj说-从pdf中引用,这是与文档字符串
相同的文本get_proj()
Create the projection matrix from the current viewing position.
elev stores the elevation angle in the z plane
azim stores the azimuth angle in the x,y plane
dist is the distance of the eye viewing point from the object point.
…这不是在描述一个4x4矩阵。
我可以尝试逆向工程矩阵中的值来给我azim和elev,但是逆向工程总是感觉错误,特别是对于一个广泛使用的库。我也没有找到任何函数来设置dist。我已经根据其中一个示例编写了一个简短的脚本来设置和询问查看位置。
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt
plt.ion()
fig = plt.figure()
ax = fig.gca(projection='3d')
theta = np.linspace(-4 * np.pi, 4 * np.pi, 100)
z = np.linspace(-2, 2, 100)
r = z**2 + 1
x = r * np.sin(theta)
y = r * np.cos(theta)
ax.plot(x, y, z, label='parametric curve')
fig.canvas.draw()
with open('dump_proj.txt','wt') as fout:
for e in range(0, 61, 30):
for a in range(0, 61, 30):
fout.write('setting azimuth to {0}, elevation to {1}n'.format(a, e))
ax.view_init(azim=a, elev=e)
fig.canvas.draw()
d=ax.get_proj()
for row in d:
fout.write('{0:8.4f} {1:8.4f} {2:8.4f} {3:8.4f} n'.format(*row))
fout.write('n')
保存文件的一个示例部分显示在这里
设置方位角为60,仰角为30
-0.1060 0.0604 0.0000 -0.0519
-0.0306 -0.0523 0.2165 0.0450
0.0000 - 0.0000
-0.0530 -0.0906 -0.1250 10.0779
我猜10是类似于观看距离。我更希望使用一些0.5或0.866的30度和60度角条目,但它看起来不像那么简单。
是否有一些功能我错过了,设置距离,或获得海拔和方位角?或者我缺少的一些文档,告诉我4x4项目矩阵是如何构造的?
我有一个变通办法,这最终可能会给我更好的时机,那就是使用另一个控件来设置方位角和仰角,然后使用view_init()左眼和右眼轴。但我更喜欢在第一个实例中从其中一个轴获得方向。
另一个问题,
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
工作吗?我只是慢慢地掌握了OO方法,这似乎很神奇。Axes3D的导入是否在幕后做了一些事情来改变pyplot的导入?我会天真地期望在导入2D内容之后导入3D内容,如果它是重写方法的话。我想如果这一切都工作,它一定是好的,但我不明白为什么。
Doh,我没有做的是查看Axes3D类的实例的dir()。它们就是。azim。elev和。dist属性