绘制三维向量

7
假设我想要获取以下三个[x,y,z]坐标:
[0.799319 -3.477045e-01 0.490093]
[0.852512 9.113778e-16 -0.522708]
[0.296422 9.376042e-01 0.181748]
然后将它们作为向量绘制,其中向量的起点是原点[0,0,0]。我应该如何操作?我一直在尝试使用matplotlib的quiver函数,但是一直遇到以下数值错误:
ValueError: need at least one array to concatenate

这是我的代码(document_matrix_projections 是上面的三个坐标表示为矩阵):
D1, D2, D3 = zip(*document_matrix_projections)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.quiver(D1)
plt.show()
2个回答

9
使用plotly绘图是matplolib quiver()的一个很好且漂亮的替代方案,它具有交互性的优势。下面这个函数可以使用plotly的Scatter3d()绘制矢量图。在此情况下,矢量使用一个大点来标记方向而不是箭头头部。
import numpy as np 
import plotly.graph_objs as go

def vector_plot(tvects,is_vect=True,orig=[0,0,0]):
    """Plot vectors using plotly"""

    if is_vect:
        if not hasattr(orig[0],"__iter__"):
            coords = [[orig,np.sum([orig,v],axis=0)] for v in tvects]
        else:
            coords = [[o,np.sum([o,v],axis=0)] for o,v in zip(orig,tvects)]
    else:
        coords = tvects

    data = []
    for i,c in enumerate(coords):
        X1, Y1, Z1 = zip(c[0])
        X2, Y2, Z2 = zip(c[1])
        vector = go.Scatter3d(x = [X1[0],X2[0]],
                              y = [Y1[0],Y2[0]],
                              z = [Z1[0],Z2[0]],
                              marker = dict(size = [0,5],
                                            color = ['blue'],
                                            line=dict(width=5,
                                                      color='DarkSlateGrey')),
                              name = 'Vector'+str(i+1))
        data.append(vector)

    layout = go.Layout(
             margin = dict(l = 4,
                           r = 4,
                           b = 4,
                           t = 4)
                  )
    fig = go.Figure(data=data,layout=layout)
    fig.show()

绘图可以简单地完成以下步骤:

p0 = [0.799319, -3.477045e-01, 0.490093]
p1 = [0.852512, 9.113778e-16, -0.522708]
p2 = [0.296422, 9.376042e-01, 0.181748]

vector_plot([p0,p1,p2])

以上代码的输出结果如下图所示:


7

quiver()函数需要箭头的位置作为X、Y、Z,以及矢量箭头的组成部分U、V、W。因此,以下脚本可以绘制您的数据:

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

p0 = [0.799319, -3.477045e-01, 0.490093]
p1 = [0.852512, 9.113778e-16, -0.522708]
p2 = [0.296422, 9.376042e-01, 0.181748]

origin = [0,0,0]
X, Y, Z = zip(origin,origin,origin) 
U, V, W = zip(p0,p1,p2)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.quiver(X,Y,Z,U,V,W,arrow_length_ratio=0.01)
plt.show()

但是结果并不美观。如果您想使用Mayavi,可以按照以下方式操作:
import numpy as np
import mayavi.mlab as m

p0 = [0.799319, -3.477045e-01, 0.490093]
p1 = [0.852512, 9.113778e-16, -0.522708]
p2 = [0.296422, 9.376042e-01, 0.181748]

origin = [0,0,0]
X, Y, Z = zip(origin,origin,origin) 
U, V, W = zip(p0,p1,p2)

m.quiver3d(X,Y,Z,U,V,W)

你好,使用mayavi时是否有办法定义箭头颜色及其方向? - shz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接