Построение векторов из фрейма данных с использованием matplotlib? - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть фрейм данных, в котором есть столбцы X, Y и Z, которые представляют координаты точек (каждая строка представляет одну точку). Я хочу нарисовать вектор из точки 1 (строка 1) в точку 2 (строка 2). Я хочу повторить такую ​​вещь для всего кадра данных.

Вот как выглядит датафрейм,

    x       y       z
0   0.67883 0.59075 0.28053
1   0.68366 0.60002 0.28022
2   0.68715 0.60797 0.27884
3   0.69358 0.61166 0.27731
4   0.70080 0.61412 0.27560
5   0.70448 0.61300 0.27581
6   0.70822 0.61747 0.27258
7   0.71459 0.62003 0.26900
8   0.71880 0.62638 0.26273
9   0.72479 0.63126 0.25372

Код, который я пробовал, здесь, он дает вектор mw, но хвост вектора должен быть в точке 1 (строка 1), а голова вектора должна быть в точке 2 (строка 2) и т. Д.

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

ax.scatter(p[:, 0], p[:, 1], p[:, 2], color = 'r', marker = 'o', alpha = 0.5)

for i in range(0, len(p), 1):
    ax.quiver(x[i], y[i], z[i], x[i+1], y[i+1], z[i+1], length = 0.001) 

ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()

x, y и z - список, содержащий каждый столбец.

1 Ответ

0 голосов
/ 05 ноября 2018

Аргументы ax.quiver неверны. Первые три значения - это расположение хвоста стрелки. Следующие 3 - это векторные компоненты, а не расположение стрелки. Таким образом, вам нужно сделать некоторую математику, которая может быть выполнена с помощью .shift.

Кроме того, нет необходимости в цикле, он принимает полные серии или массивы.

С учетом вашего DataFrame имени df:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

ax.scatter(df.x, df.y, df.z, color = 'r', marker = 'o', alpha = 0.5)

ax.quiver(*df[:-1].T.values, *(df.shift(-1)-df)[:-1].T.values , length=1)
# equivalent to
#ax.quiver(df.x[:-1], df.y[:-1], df.z[:-1], 
#          (df.x.shift(-1)-df.x)[:-1], 
#          (df.y.shift(-1)-df.y)[:-1], 
#          (df.z.shift(-1)-df.z)[:-1], length = 1) 

ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...