使用matplotlib绘制3d矢量

时间:2014-11-19 17:23:25

标签: python vector matplotlib 3d

我正在尝试使用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 个答案:

答案 0 :(得分:14)

你需要在mpl_toolkits中使用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

produced_output

答案 1 :(得分:2)

从其他答案和评论中,matplotlib版本之间显然存在差异。但是,我相信Tim B的回答并没有回答这个问题。绘制的箭数不代表给定的向量,因为它们的大小没有得到恰当的表示。此外,箭头似乎位于矢量的预定起点。

以下内容(根据上一个答案中的代码改编而来)使用 Scanner in = new Scanner(System.in); do{ System.out.println(""); System.out.println("Please choose from the following options. " ); System.out.println(""); System.out.println("1. Do you want to use the default rotor settings? "); System.out.println("2. Do you want to use the custom rotor settings? "); System.out.println("3. Start over. "); System.out.println(""); menuOneAnwser = in.nextInt(); }while(menuOneAnwser < 0 || menuOneAnwser > 3); try{ switch(menuOneAnwser){ case 1: Enigma.defaultSwitch = true; break; case 2: Enigma.defaultSwitch = false; g.customRotor(); break; case 3: introduction(); break; default: break; } }catch(InputMismatchException e){ System.out.println("That is not a integer.... Please enter a interger between 1 and 2!" ); System.out.println("Please try again.." ); System.out.println(""); } python2.7中生成所需结果。为了使矢量可视化,将枢轴点设置为matplotlib1.5.3并按矢量的大小缩放箭袋具有所需的效果。箭袋箭头按比例缩放为箭袋长度。在这里,我将比例因子除以矢量的大小,使所有箭头与pivot='tail'的大小相同。

坏点 - 我的代码并不紧凑。我必须以解包的形式提供X,Y,Z,U,V,W,以便在每次调用ax.quiver时使用不同的kwargs。如果有人可以推荐一个包含kwargs的编辑,我将非常感激。

arrow_length_ratio=0.3/vlength

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