我正在使用matplotlib.patches.Polygon来更新图形上的一些彩色补丁,并且我在代码的每次迭代中都会这样做。因为我已经用这种方式在我的代码中定义了补丁,所以我想使用 函数contains_point()来解析一个点是否在 补丁或其外部。到目前为止看起来很有效 - 但我不愿意这样做,我宁愿继续使用matplotlib。调用add_patch()后出现问题:在这种情况下,补丁将返回相同的坐标,但函数contains_point()将不会返回正确的值
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from matplotlib import gridspec
import numpy as np
让我们定义一些我们想要添加补丁的轴
gs = gridspec.GridSpec(1,1)
axx = [plt.subplot(g) for g in gs]
让我们看看axx的类型:
In[84]: axx
Out[84]: [<matplotlib.axes._subplots.AxesSubplot at 0x7fd4b3409cd0>]
现在让我们定义一个顶点为b
的补丁v
v =
np.array([[ 6.89 , -10.00907385],
[ 5.11 , -10.00907385],
[ 5.11 , -14.68307385],
[ 6.89 , -14.68307385],
[ 6.89 , -10.00907385]])
b = [patches.Polygon(v, color = (0,0,1))]
我们可以测试一下:
In[86]: b[0].contains_point((5.5,-12))
Out[86]: True
现在让补丁添加到之前初始化的子图
axx[0].add_patch(b[0])
如果同一点(5.5,-12)属于补丁b
,请再次测试
In[88]: b[0].contains_point((5.5,-12))
Out[88]: False
In[89]: b[0].get_xy()
Out[89]:
array([[ 6.89 , -10.00907385],
[ 5.11 , -10.00907385],
[ 5.11 , -14.68307385],
[ 6.89 , -14.68307385],
[ 6.89 , -10.00907385]])
答案 0 :(得分:1)
将多边形添加到轴后,contains_point
使用内部坐标确定多边形中是否包含某个点。
因此,您需要先将point
转换为屏幕坐标系,然后查询它是否包含在修补程序poly
中,
poly.contains_point(ax.transData.transform(point))
另外,使用补丁&#39;路径&#39; contains_point
方法,未指定任何转换,
poly.get_path().contains_point(point)
完整的示例代码:
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import numpy as np
a = np.array([[2,6],[4,6],[4,8],[2,8],[2,6]])
poly = patches.Polygon(a)
point = (3,7)
cp1 = poly.contains_point(point)
print (cp1) # prints True
fig,ax = plt.subplots()
ax.add_patch(poly)
cp2 = poly.contains_point(ax.transData.transform(point))
print(cp2) # prints True
cp3 = poly.get_path().contains_point(point)
print(cp3) # prints True
ax.scatter(point[0],point[1], color="crimson", zorder=6)
plt.show()