我正在尝试使用matplotlib在3d中绘制矢量图。我使用了以下代码,该代码基于前面绘制2d向量的示例,但添加了3d向量的组件。
#!/usr/bin/python
import numpy as np
import matplotlib.pyplot as plt
soa =np.array( [ [0,0,1,1,-2,0], [0,0,2,1,1,0],[0,0,3,2,1,0],[0,0,4,0.5,0.7,0]])
X,Y,Z,U,V,W = zip(*soa)
plt.figure()
ax = plt.gca()
ax.quiver(X,Y,Z,U,V,W,angles='xyz',scale_units='xyz',scale=1,color='b')
ax.set_xlim([-1,10])
ax.set_ylim([-1,10])
ax.set_zlim([10,1])
plt.draw()
plt.show()
有没有什么想法来调整这个来制作一个3d矢量图?
2条答案
按热度按时间pzfprimi1#
您需要在mpl_toolkits中使用mplot3d中的Axes3D,然后将子图投影设置为3d:
**注意:**旧版本的matplotlib经常会给予这个代码的错误。尝试至少使用版本1。5
yhived7q2#
从其他回答和评论来看,matplotlib版本之间显然存在差异。然而,我相信Tim B的回答并没有回答这个问题。所绘制的 Flutter 图并不代表给定的矢量,因为它们的幅值没有被正确地表示。此外,箭头似乎位于矢量的预期起始点。
下面的代码改编自上一个答案中的代码,生成
python2.7
中的所需结果,其中matplotlib1.5.3
。要可视化矢量,将枢轴点设置为pivot='tail'
,并按矢量的大小缩放 Flutter ,即可获得所需的效果。箭袋箭头的缩放比例为箭袋长度的比例。在这里,我将缩放因子除以向量的大小,使所有箭头的大小都相同,即arrow_length_ratio=0.3/vlength
。缺点-我的代码不是很紧凑。我不得不以一个未打包的形式提供X,Y,Z,U,V,W,以便在每次调用ax时使用不同的kwargs。如果有人能建议一个编辑,包kwargs我会非常感激。
输出:Plot of vectors as quivers with matplotlib-1.5.3.