【问题标题】:Plot vector subtraction in matplotlib在 matplotlib 中绘制向量减法
【发布时间】:2022-01-15 21:40:13
【问题描述】:

我想绘制三个向量,bdd-b。当然,这意味着d-b 的尾巴碰到了b 的头部。我正在使用this SO 绘制箭头。但是,我显然不了解 API,因为我得到的数字令人困惑。箭头看起来大致方向正确,但幅度相差甚远。不知道我在这里做错了什么。

import numpy as np
import matplotlib.pyplot as plt


b = np.array([4, 1])
d = np.array([-3, 3])
m = d-b

o = np.array([
    [0, 0, b[0]],
    [0, 0, b[1]]
])
v = np.array([
    [b[0], b[1]],
    [d[0], d[1]],
    [m[0], m[1]]
])

fig, ax = plt.subplots()
ax.quiver(*o, v[:, 0], v[:, 1])
plt.show()

【问题讨论】:

    标签: python numpy matplotlib


    【解决方案1】:

    根据this 和matplotlib 文档here,您需要使用angles='xy', scale_units='xy', scale=1 来获得正确的单位。

    见下面的代码:

    import numpy as np
    import matplotlib.pyplot as plt
    
    
    b = np.array([4, 1])
    d = np.array([-3, 3])
    m = d-b
    print(np.linalg.norm(d))
    o = np.array([
        [0, 0, b[0]],
        [0, 0, b[1]]
    ])
    v = np.array([
        [b[0], b[1]],
        [d[0], d[1]],
        [m[0], m[1]]
    ])
    
    fig, ax = plt.subplots()
    ax.quiver(*o, v[:, 0], v[:, 1],angles='xy', scale_units='xy', scale=1)
    ax.set_xlim([-4,4])
    ax.set_ylim([-4,4])
    plt.show()
    

    还有输出:

    【讨论】:

      【解决方案2】:

      这样存储向量的坐标更方便:

      S = np.stack([*o, v[:, 0], v[:, 1]])
      >>> S
      array([[ 0,  0,  4],
             [ 0,  0,  1],
             [ 4, -3, -7],
             [ 1,  3,  2]])
      

      现在您可以通过这种方式访问​​起点和方向的坐标:

      >>> S[:2], S[2:]
      (array([[0, 0, 4],
              [0, 0, 1]]),
       array([[ 4, -3, -7],
              [ 1,  3,  2]]))
      

      以及终点坐标:

      >>> S[:2] + S[2:]
      array([[ 4, -3, -3],
             [ 1,  3,  3]])
      

      所以你可以得到一个平面上的所有点:

      >>> pts = np.hstack([S[:2], S[:2] + S[2:]])
      array([[ 0,  0,  4,  4, -3, -3],
             [ 0,  0,  1,  1,  3,  3]])
      

      对于后面的部分,请查看jylls 的答案并使用:

      plt.quiver(*S, angles='xy', scale_units='xy', scale=1)
      

      最后,既然您有一个不错的情节,您可能会对如何为情节指定边界感兴趣。你可以这样做:

      x_min, y_min = np.min(pts, axis=1)
      x_max, y_max = np.max(pts, axis=1)
      plt.xlim([x_min, x_max])
      plt.ylim([y_min, y_max])
      plt.show()
      

      【讨论】:

        猜你喜欢
        • 2021-12-30
        • 2023-03-06
        • 2016-10-05
        • 2021-02-02
        • 2017-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多