PHP前端开发

如何在 Matplotlib 3D 图中为矢量添加箭头?

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

在 matplotlib 3d 图中将箭头放在矢量上

在绘制 3d 数据的特征向量时,我们希望在这些向量上放置箭头。为了实现这一目标,我们可以使用一个名为 arrow3d 的自定义箭头补丁类,该类扩展了 matplotlib 的 fancyarrowpatch。

arrow3d 类覆盖了 fancyarrowpatch 中的 posa 和 posb 属性,并将这些属性投影到 2d 以在 3d 图中绘制箭头。

步骤:

  1. 从 3d 坐标创建 arrow3d 对象。
  2. 使用 proj3d 模块将 3d 坐标投影到 2d。
  3. 将投影的 2d 坐标分配给 posa 和 posb 属性。

示例:

我们修改了原始示例代码,添加了 arrow3d 箭头艺术家:

import numpy as npfrom 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)samples, eig_vec = ...  # 样本数据和特征向量计算fig = plt.figure(...)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 散点图上,每个特征向量现在都绘制有一个指向其方向的箭头。