我有一个数据框,其中的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是包含每一列的列表。
答案 0 :(得分:2)
您的ax.quiver
参数不正确。前三个值是箭头尾部的位置。接下来的3个是矢量分量,而不是箭头的位置。因此,您需要做一些数学运算,可以使用.shift
完成。
此外,也无需循环,它接受完整的Series或数组。
给出您的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()