Подтвердить что ты не робот

Построение трехмерных векторов с использованием matplot lib

Я пытаюсь построить векторы в 3d, используя matplotlib. Я использовал следующий код, основанный на предыдущем примере построения 2d векторов, но добавил компоненты для трехмерных векторов.

#!/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-векторный график?

4b9b3361

Ответ 1

Вам нужно использовать Axes3D из mplot3d в mpl_toolkits, а затем настроить проекцию подзаголовка на 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

Ответ 2

Из других ответов и комментариев явно существует разница между версиями matplotlib. Тем не менее, я считаю, что ответ Тима Б не отвечает на вопрос. Кривые колчанов не представляют данные векторы, так как их величины не представлены должным образом. Кроме того, стрелки, по-видимому, сидят в намеченных начальных точках векторов.

Следующее, адаптированное из кода предыдущего ответа, дает желаемый результат в python2.7 с помощью matplotlib1.5.3. Чтобы визуализировать вектор, установка точки поворота на pivot='tail' и масштабирование колчана по величине вектора имеет желаемый эффект. Стрелка наконечника колчана масштабируется как отношение длины колчана. Здесь я делят масштабный коэффициент на величину вектора, чтобы все стрелки имели одинаковый размер с arrow_length_ratio=0.3/vlength.

Плохие очки - мой код не очень компактен. Я должен был предоставить X, Y, Z, U, V, W в распакованном виде, чтобы использовать разные kwarg для каждого вызова ax.quiver. Если кто-то может предложить отредактировать, что пакеты 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()

Вывод: График векторов как колчан с matplotlib-1.5.3.