Я не нашел ничего прямолинейного в matplotlib. Одним из возможных решений является использование колчана:
from mpl_toolkits.mplot3d import Axes3D # keep it for projection='3d'
import matplotlib.pyplot as plt
import random
def calculate_vectors(x0, y0, z0, x1, y1, z1):
u = []
v = []
w = []
for i, x in enumerate(x0):
dx = x1[i] - x
dy = y1[i] - y0[i]
dz = z1[i] - z0[i]
u.append(dx)
v.append(dy)
w.append(dz)
return u, v, w
def make_plot():
n = 20
x1 = [random.randrange(23, 32, 1) for _ in range(n)]
y1 = [random.randrange(0, 100, 1) for _ in range(n)]
z1 = [1.0 for _ in range(n)]
x2 = [random.randrange(23, 32, 1) for _ in range(n)]
y2 = [random.randrange(0, 100, 1) for _ in range(n)]
z2 = [2.0 for _ in range(n)]
u, v, w = calculate_vectors(x1, y1, z1, x2, y2, z2)
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.scatter(x1, y1, z1, c='b', marker='^')
ax.scatter(x2, y2, z2, c='r', marker='o')
ax.quiver(x1, y1, z1, u, v, w, arrow_length_ratio=0.0)
make_plot()
plt.show()
Я не использовал numpy, так как было веселее обновлять векторы и вычисления sin / cos. Вот вывод: