【发布时间】:2016-02-10 22:24:09
【问题描述】:
我正在尝试使用 matplotlib 在 python 中重现 this animation 的左侧图。
我可以使用 3D quiver 函数生成矢量箭头,但正如我 read here 一样,似乎无法设置箭头的长度。所以,我的情节看起来不太对:
所以,问题是:如何生成多个不同长度的 3D 箭头?重要的是,我能否以这样一种方式生成它们,以便我可以轻松地为动画的每一帧进行修改?
到目前为止,这是我的代码,采用不太有前途的 3D 箭袋方法:
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d
ax1 = plt.subplot(111,projection='3d')
t = np.linspace(0,10,40)
y = np.sin(t)
z = np.sin(t)
line, = ax1.plot(t,y,z,color='r',lw=2)
ax1.quiver(t,y,z, t*0,y,z)
plt.show()
【问题讨论】:
-
你的数据中是否有长度变量
-
为了匹配另一个图,向量的长度应该足以将它们扩展到 x(或 t 这种情况下)轴。我在想,绘制箭头实际上可能不需要长度,但如果是的话,它可以很容易地计算为 length = np.sqrt(y**2 + z**2)。
-
不幸的是,它似乎不是(目前):github.com/matplotlib/matplotlib/issues/4211
-
问题是 mplot3d 总是标准化箭头长度。我知道这很不雅,但是如果您手动编辑
mpl_toolkits/mplot3d/axes3d.py并将这一行norm = math.sqrt(u ** 2 + v ** 2 + w ** 2)更改为norm = 1它将适用于您当前的代码。我不知道为什么开发人员不会添加标志以仅在需要时执行规范化。
标签: python animation matplotlib 3d