【问题标题】:Plotting vectors from dataframe using matplotlib?使用matplotlib从数据框中绘制向量?
【发布时间】:2018-11-05 05:23:36
【问题描述】:

我有一个数据框,其中包含 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 是包含每一列的列表。

【问题讨论】:

    标签: python pandas dataframe matplotlib vector


    【解决方案1】:

    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()
    

    【讨论】:

      猜你喜欢
      • 2021-02-02
      • 2017-11-20
      • 2020-08-23
      • 2022-01-27
      • 2017-07-06
      • 2020-06-20
      • 2016-06-04
      • 2018-01-18
      • 2012-11-12
      相关资源
      最近更新 更多