我正在学习Matplotlib,所以我直接去立体可视化。我已经建立了镜子来查看屏幕,并得到了左和右的数字更新交互式的正确距离分开。
我现在需要做的是询问一个轴的方向,设置另一个轴的方向。我有RFTM'd,并做了帮助(Axes 3D.函数),不幸的是,文档似乎有点薄,而且不一致。
到目前为止,我发现的唯一一个设置/获取查看方向的Axes 3D调用是view_init(azim=,elev=)和get_proj(),后者返回一个4x 4变换矩阵。
现在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.
这不是一个4x 4的矩阵。
我可以尝试对矩阵中的值进行逆向工程,给予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.10600.06040.0000 - 0.0519
-0.0306 -0.0523 0.2165 0.0450
0.0000 0.00000000 - 10.0000
-0.0530 -0.0906 -0.1250 10.0779
我想10是类似于观看距离的东西。我希望能有0。5或0.866条目,使用30度和60度角,但看起来并不那么简单。
是否有一些功能我错过了,设置距离,或获得仰角和方位角?或者是我缺少的一些文档,告诉我如何构造4x 4 proj矩阵?
我有一个变通方案,它最终可能会给予我更好的时间,那就是使用另一个控件来设置方位角和仰角,然后使用它来view_init()左右眼轴。但我更喜欢在第一个例子中从其中一个轴获得方向。
另一个问题,如何
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
工作?我只是慢慢地掌握OO方法,这似乎是魔术般的工作。Axes 3D的导入是否会在幕后改变pyplot的导入?如果是覆盖方法的话,我会很期待在2D的东西之后导入3D的东西。我想如果这一切都有效的话,那肯定没问题,但我不知道怎么做到的。
1条答案
按热度按时间esbemjvw1#
Doh,我没有做的是查看Axes3D类的 * 示例 * 的dir()。他们来了。Azim,.elev and .dist属性。