python - 查找叉积以查找 MatplotLib 中线上方/下方的点

标签 python matplotlib

我试图在 MatPlotLib 中画一条线,并根据斜率找到该线上方或下方的所有点。

读完这篇文章后post ,并阅读有关叉积的内容,我相信这是我检查要点的最佳方法。

我不确定在 python 中实现此功能的最佳方法是什么。

v1 = {x2-x1, y2-y1}   # Vector 1
v2 = {x2-xA, y2-yA}   # Vector 2
xp = v1.x*v2.y - v1.y*v2.x  # Cross product

有人尝试过实现类似的东西吗?

还有其他方法可以让我找到绘图上的点是在 MatPlotLib 中的线上方还是下方吗?

最佳答案

正如所见,例如在 this question叉积确实可以用来确定一个点是位于由两点定义的线的上方还是下方。

因此,让 ab 是定义一条线的两个点,而 p 是我们要定义的一个(一组)点想知道与线的相对位置。那么如果

numpy.cross(p-a, b-a) < 0

如果True,则点位于直线之上。

这里准确地说,“上方”是指从点ab看,点p位于线。

这可用于对散点图中的点进行不同的着色,具体取决于它们是在线上方还是下方,如下所示:

import numpy as np
import matplotlib.pyplot as plt

isabove = lambda p, a,b: np.cross(p-a, b-a) < 0

a = np.array([1,1])
b = np.array([4,3])

p1 = np.array([2,4])
p2 = np.array([3,1])

p = np.array([p1,p2])


fig, (ax,ax2) = plt.subplots(ncols=2, sharex=True, sharey=True)

ax.plot([a[0],b[0]],[a[1],b[1]], marker="o", color="k")
ax.scatter(p[:,0],p[:,1], c=isabove(p,a,b), cmap="bwr", vmin=0, vmax=1)

p = np.random.rand(10,2)*5

ax2.plot([a[0],b[0]],[a[1],b[1]], marker="o", color="k")
ax2.scatter(p[:,0],p[:,1], c=isabove(p,a,b), cmap="bwr", vmin=0, vmax=1)


ax.set_xlim(0,6)
ax.set_ylim(0,6)
plt.show()

enter image description here

关于python - 查找叉积以查找 MatplotLib 中线上方/下方的点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45766534/

相关文章:

python - 在Python中创建[self]respawning应用程序的正确方法

Python:为什么数据被插入到列表/字典的两个字典中

python - 我可以使用具有已知步骤的排序数组来制作 O(1) 搜索算法吗?

python - 图例的“最佳”位置是覆盖文本

python - 使用 Matplotlib 绘制多级标题数据框

python - 通过 Python 的 Matplotlib 将 3 个条堆叠在一起

python - 获取今天和上一个日期之间的天数差异

python - 如何正确设置按钮的粘性属性?

python - 使用matplotlib : plot error bars on two y axes

python - Bokeh : sizing_mode ="stretch_both" is not working in tabs