PHP前端开发

如何在 Matplotlib 的 3D 图中绘制矢量上的箭头?

百变鹏仔 5天前 #Python
文章标签 箭头

在 matplotlib 的 3d 图中绘制矢量上的箭头

想要将箭头放置在 3d 图形中绘制的特征向量上。

解决方案

创建自定义箭头补丁类

由于 matplotlib 的 fancyarrowpatch 类仅适用于 2d 图形,因此需要创建一个新的箭头补丁类 arrow3d,该类继承自 fancyarrowpatch。覆盖 posa 和 posb 方法,将 3d 坐标投影到 2d,然后将其分配给 posa 和 posb。

修改绘图代码

在绘图代码中,将箭头艺术家添加到包含特征向量的绘图对象中。使用自定义的 arrow3d 类,为每个特征向量绘制一个箭头,从平均位置延伸到特征向量末端。

最终代码

import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom matplotlib.patches import FancyArrowPatchfrom mpl_toolkits.mplot3d import proj3dclass Arrow3D(FancyArrowPatch):    def __init__(self, xs, ys, zs, *args, **kwargs):        FancyArrowPatch.__init__(self, (0,0), (0,0), *args, **kwargs)        self._verts3d = xs, ys, zs    def draw(self, renderer):        xs3d, ys3d, zs3d = self._verts3d        xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M)        self.set_positions((xs[0],ys[0]),(xs[1],ys[1]))        FancyArrowPatch.draw(self, renderer)# 数据生成和特征向量计算...# 绘图fig = plt.figure(figsize=(15,15))ax = fig.add_subplot(111, projection='3d')...for v in eig_vec:    a = Arrow3D([mean_x, v[0]], [mean_y, v[1]],                [mean_z, v[2]], mutation_scale=20,                lw=3, arrowstyle="-|>", color="r")    ax.add_artist(a)...

输出

将看到带箭头的特征向量绘制在 3d 图中。