matplotlib.patches.Polygon函数contains_point()无法解析补丁中的某个点

问题描述 投票:2回答:1

我正在使用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]])  
python matplotlib polygon
1个回答
1
投票

将多边形添加到轴后,contains_point使用内部坐标确定多边形中是否包含某个点。

因此,您需要先将point转换为屏幕坐标系,然后查询它是否包含在补丁poly中,

poly.contains_point(ax.transData.transform(point))

或者,使用补丁'路径'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()
© www.soinside.com 2019 - 2024. All rights reserved.