Matplotlib path.contains_points对某些边上的点返回false,但不返回其他边

时间:2017-11-06 18:51:21

标签: python python-3.x matplotlib

我正在尝试使用Matplotlib查找多边形路径中包含的所有点,但似乎缺少一些。更具体地说,我的路径是一个矩形,并且这些点位于底层均匀网格上。在下面的测试脚本中,它不会将多边形顶线上的点视为多边形的一部分,而是考虑其余边缘上的点。

代码:

import matplotlib.path as mpltPath

polygon = [(5,5),(10,5),(10,10),(5,10)]
width =11
height =11

points = [[0,0],[1,0],[2,0],[3,0],[4,0],[5,0],[6,0],[7,0],[8,0],[9,0],[10,0],[11,0], \
          [0,1],[1,1],[2,1],[3,1],[4,1],[5,1],[6,1],[7,1],[8,1],[9,1],[10,1],[11,1],\
          [0,2],[1,2],[2,2],[3,2],[4,2],[5,2],[6,2],[7,2],[8,2],[9,2],[10,2],[11,2],\
          [0,3],[1,3],[2,3],[3,3],[4,3],[5,3],[6,3],[7,3],[8,3],[9,3],[10,3],[11,3],\
          [0,4],[1,4],[2,4],[3,4],[4,4],[5,4],[6,4],[7,4],[8,4],[9,4],[10,4],[11,4],\
          [0,5],[1,5],[2,5],[3,5],[4,5],[5,5],[6,5],[7,5],[8,5],[9,5],[10,5],[11,5],\
          [0,6],[1,6],[2,6],[3,6],[4,6],[5,6],[6,6],[7,6],[8,6],[9,6],[10,6],[11,6],\
          [0,7],[1,7],[2,7],[3,7],[4,7],[5,7],[6,7],[7,7],[8,7],[9,7],[10,7],[11,7],\
          [0,8],[1,8],[2,8],[3,8],[4,8],[5,8],[6,8],[7,8],[8,8],[9,8],[10,8],[11,8],\
          [0,9],[1,9],[2,9],[3,9],[4,9],[5,9],[6,9],[7,9],[8,9],[9,9],[10,9],[11,9],\
          [0,10],[1,10],[2,10],[3,10],[4,10],[5,10],[6,10],[7,10],[8,10],[9,10],[10,10],[11,10],\
          [0,11],[1,11],[2,11],[3,11],[4,11],[5,11],[6,11],[7,11],[8,11],[9,11],[10,11],[11,11]]


path = mpltPath.Path(polygon)
inside = path.contains_points(points)
print(inside)

按原样,上面的代码将返回

[False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False  True  True  True  True  True  True False
 False False False False False  True  True  True  True  True  True False
 False False False False False  True  True  True  True  True  True False
 False False False False False  True  True  True  True  True  True False
 False False False False False  True  True  True  True  True  True False
 False False False False False False False False False False False False]

我希望结果的第5行包含类似后面的True值。如果我将多边形中的坐标从5更改为4.9,那么我确实得到了我期望的结果。

我认为这与滥用或误解功能有关,但我不太确定可能是什么或如何。

编辑:提出contains_points对于落在多边形边缘的点应该返回False。在我的例子中,我们看到上边缘[5,5] - [10,5]的这种行为,但不是其他边缘(即[5,5] - [5,10],[5,10] - [10,10],[10,10] - [10,5])。这三个其他边对应于具有True值的第一列和最后一列,最后一行对应于上面示例输出中的True值。这是明显不一致的问题。

1 个答案:

答案 0 :(得分:3)

更新:现在是一个开放的issue in matplotlib

排除边框上的线条可能是contains_points等函数的预期行为。 但是,在这种情况下,多边形边框上的点不会以一致的方式处理

在示例中,您给出第5行表示在边界上排除了点,但第5行和第10行表示包含了边界点。

使用polygon[::-1]绘制路径,因此反转方向会导致所有边框的预期行为,但第10行除外,其中再次应用包含。

对我来说,这里没有明显的逻辑模式。但即使有一个,这种行为肯定会令人困惑,应该修复。

现在,您仍然可以通过避免将点放在多边形的边界上来获得所需的行为。您可以使用contains_points函数的radius属性执行此操作:

  

radius 允许路径稍大或稍小。

因此,如果您为radius属性提供一些小的,正的或负的值,如下所示:

# ...
path = mpltPath.Path(polygon)
inside = path.contains_points(points,radius=0.1)

print(inside)

你得到:

[False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False  True  True  True  True  True  True False
 False False False False False  True  True  True  True  True  True False
 False False False False False  True  True  True  True  True  True False
 False False False False False  True  True  True  True  True  True False
 False False False False False  True  True  True  True  True  True False
 False False False False False  True  True  True  True  True  True False
 False False False False False False False False False False False False]

注意,半径应该是正数还是负数取决于方向。您可以找到有关此here的更多信息。根据经验:当路径逆时针方向时,正半径会扩展路径,当路径顺时针方向移动时缩小路径