Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python matplotlib绘制三维矢量_Python_Vector_Matplotlib_3d - Fatal编程技术网

使用Python matplotlib绘制三维矢量

使用Python matplotlib绘制三维矢量,python,vector,matplotlib,3d,Python,Vector,Matplotlib,3d,我正在尝试使用matplotlib在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

我正在尝试使用matplotlib在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()

关于如何调整此参数以生成三维矢量图,您有什么想法吗?

您需要在mpl_工具包中使用来自mplot3d的Axes3D,然后将子地块投影设置为3d:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

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)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.quiver(X, Y, Z, U, V, W)
ax.set_xlim([-1, 0.5])
ax.set_ylim([-1, 1.5])
ax.set_zlim([-1, 8])
plt.show()
注意:旧版本的matplotlib经常会给出此代码的错误。尝试至少使用1.5版


从其他答案和评论来看,matplotlib版本之间显然存在差异。然而,我相信Tim B的答案并不能回答这个问题。标绘的震颤不代表给定的矢量,因为它们的震级没有正确表示。此外,箭头似乎位于向量的预期起点处

以下内容改编自上一个答案中的代码,使用
matplotlib1.5.3
python2.7
中生成所需的结果。要可视化矢量,请将轴点设置为
pivot='tail'
,并按矢量大小缩放箭袋,以获得所需效果。箭袋箭头按箭袋长度的比例缩放。这里,我将比例因子除以向量的大小,使所有箭头的大小相同,且
arrow\u length\u ratio=0.3/v长度

缺点-我的代码不是很紧凑。我必须以未打包的形式提供X、Y、Z、U、V、W,以便在每次调用ax.quiver时使用不同的Kwarg。如果有人能提出一个包含kwargs的编辑建议,我将不胜感激

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

vectors=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]]) 
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
for vector in vectors:
    v = np.array([vector[3],vector[4],vector[5]])
    vlength=np.linalg.norm(v)
    ax.quiver(vector[0],vector[1],vector[2],vector[3],vector[4],vector[5],
            pivot='tail',length=vlength,arrow_length_ratio=0.3/vlength)
ax.set_xlim([-4,4])
ax.set_ylim([-4,4])
ax.set_zlim([0,4])
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.show()
输出:

我试着按照你的建议去做,但我得到了一个错误:AttributeError:“Quiver”对象没有属性“do_3d_projection”如何解决这个问题?@jms1980这很奇怪,我在python 2和python 3中试过,它对我来说很好。您遇到了什么错误?@jms1980您有什么版本的matplotlib?我使用的是最新的稳定版本1.4.2。您还可以执行
pip安装matplotlib--升级
。除了Tim B的回答之外,您使用的matplolib版本非常重要。matplotlib 1.3.1似乎有1.4.2解决的问题,特别是现在的1.5.1解决了这些问题。在matplotlib2.0.0中,箭袋长度已针对该功能进行了适当的缩放,因此
ax.quivel(向量[0],向量[1],向量[2],向量[3],向量[4],向量[5],枢轴='尾巴',长度=v长度,箭头长度/v长度比=0.3/v长度)
应更改为
ax.quiver(向量[0],向量[1],向量[2],向量[3],向量[4],向量[5],pivot='tail',arrow_length_ratio=0.3/vlength)
,或返回到
ax.quiver(X,Y,Z,U,V,W,pivot='tail')
,使用压缩数组(参见Tim B的答案),如果您不需要缩放箭头。