使用 Python matplotlib 绘制 3d 矢量

Posted

技术标签:

【中文标题】使用 Python matplotlib 绘制 3d 矢量【英文标题】:plotting 3d vectors using Python matplotlib 【发布时间】: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 矢量图的任何想法?

【问题讨论】:

【参考方案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 的回答)如果您不需要缩放箭头。

以上是关于使用 Python matplotlib 绘制 3d 矢量的主要内容,如果未能解决你的问题,请参考以下文章

一个Python函数解决各样式折线图绘制——Matplotlib库示例

一个Python函数解决各样式折线图绘制——Matplotlib库示例

在 matplotlib 图中绘制平滑曲线

如何使用matplotlib在python中绘制向量

python3——matplotlib绘图1

python使用matplotlib绘制三维空间散点图