登录
首页 >  文章 >  python教程

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

时间:2024-11-23 13:08:17 288浏览 收藏

大家好,我们又见面了啊~本文《如何在 Matplotlib 3D 图中为矢量添加箭头?》的内容中将会涉及到等等。如果你正在学习文章相关知识,欢迎关注我,以后会给大家带来更多文章相关文章,希望我们能一起进步!下面就开始本文的正式内容~

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

在 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 np
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.patches import FancyArrowPatch
from mpl_toolkits.mplot3d import proj3d

class 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 散点图上,每个特征向量现在都绘制有一个指向其方向的箭头。

今天带大家了解了的相关知识,希望对你有所帮助;关于文章的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>