如何用plt.arrow画出两边分开的箭头?

时间:2019-09-09 15:22:38

标签: python python-3.x matplotlib

我试图像这样从2个点绘制2个相反的箭头

2 separate arrows

现在我可以绘制2个相对的箭头,但是像这样在另一个箭头上

enter image description here

我知道要绘制的代码是

plt.arrow(x_start, y_start, x_length, y_length)

但是不知道如何绘制2条这样的独立箭头。有什么想法计算这两个箭头的起点的偏移量(x,y)坐标吗?

1 个答案:

答案 0 :(得分:2)

假设您具有如下定义的x值和y值(x_length在这里可能会误导):

import numpy as np
import matplotlib.pyplot as plt

x_start = 0.2
x_delta = 0.7
y_start = 0.2
y_delta = 0.4

基于x_deltay_delta,您可以计算归一化的(长度= 1)正交矢量(与您的箭头正交):

orth_vector = np.array([y_delta, -x_delta])
orth_normalized = orth_vector/np.linalg.norm(orth_vector)

借助正交向量,您可以沿任意方向移动箭头,使其与原始箭头保持平行。例如,在下面的示例中使用offset=0.1,箭头将移动,因此箭头的距离为0.1

offset = 0.1
x_start_shift = x_start + offset * orth_normalized[0]
y_start_shift = y_start + offset * orth_normalized[1]

绘制所有内容时,将显示已移动的箭头以及原始箭头(注意:您可以保留增量,只需要移动起点)即可:

plt.scatter(x_start, y_start)
plt.scatter(x_start + x_delta, y_start + y_delta)
plt.arrow(x_start,y_start,x_delta,y_delta)
plt.arrow(x_start_shift,y_start_shift,x_delta,y_delta)
plt.ylim(0,1)
plt.xlim(0,1)
plt.gca().set_aspect('equal', adjustable='box')
plt.show()