【问题标题】:plotting 3d vectors using Python matplotlib使用 Python matplotlib 绘制 3d 矢量
【发布时间】:2015-01-17 08:07:35
【问题描述】:

我正在尝试使用 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 矢量图的任何想法?

【问题讨论】:

    标签: python vector matplotlib 3d


    【解决方案1】:

    你需要在mpl_toolkits中使用mplot3d中的Axes3D,然后将subplot投影设置为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 版

    【讨论】:

    • 我尝试按照您的建议进行操作,但出现错误:AttributeError: 'Quiver' object has no attribute 'do_3d_projection 我该如何解决?
    • @jms1980 这很奇怪,我已经在 python 2 和 python 3 中尝试过,对我来说效果很好。你遇到了什么错误?
    • @jms1980 你有什么版本的matplotlib?我正在使用最新的稳定版本 1.4.2。
    • 你也可以pip install matplotlib --upgrade
    • 除了 Tim B 的回答之外,您使用的 matplolib 版本也很重要。 matplotlib 1.3.1 似乎存在已由 1.4.2 解决的问题,尤其是现在由 1.5.1 解决的问题。
    【解决方案2】:

    从其他答案和 cmets 来看,matplotlib 版本之间显然存在差异。但是,我相信 Tim B 的回答并没有回答这个问题。绘制的箭袋不代表给定的向量,因为它们的大小没有正确表示。此外,箭头似乎位于向量的预期起点。

    以下内容改编自上一个答案中的代码,在python2.7matplotlib1.5.3 中产生所需的结果。为了可视化一个向量,将轴心点设置为pivot='tail' 并按向量的大小缩放箭袋具有预期的效果。箭筒箭头按箭筒长度的比例缩放。在这里,我将缩放因子除以向量的大小,使所有箭头与arrow_length_ratio=0.3/vlength 大小相同。

    坏点 - 我的代码不是很紧凑。我必须以未打包的形式提供 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()
    

    输出: Plot of vectors as quivers with matplotlib-1.5.3.

    【讨论】:

    • 在 matplotlib2.0.0 中,箭袋长度已针对此功能进行了适当缩放,因此应将 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.quiver(vector[0],vector[1],vector[2],vector[3],vector[4],vector[5], pivot='tail',arrow_length_ratio=0.3/vlength),或使用压缩数组返回 ax.quiver(X, Y, Z, U, V, W, pivot='tail')(参见 Tim B 的回答)如果您不需要缩放箭头。
    猜你喜欢
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多