Matplotlib路径contains_point

时间:2016-04-19 22:00:46

标签: python matplotlib

我刚刚发现了matplotlib路径功能,我正在使用path.contains_point来检查是否在由2条贝塞尔曲线定义的区域内找到了点。

当我希望它返回contains_pointTrue正在返回False,我会收到一些意想不到的行为。具体来说,如果要测试的点位于该区域的左侧,那么它似乎是不正确的。在右边是好的。

将我的路径定义为多条直线而不是曲线似乎按预期工作。

失败的测试用例如下:

import matplotlib 
import matplotlib.path as mplPath
import matplotlib.patches as patches

import matplotlib.pyplot as plt
import pylab
import pandas as pd

print "MPL Version {}".format(matplotlib.__version__) #1.5.0
print "MPL NP Version {}".format(matplotlib.__version__numpy__) #1.6

path_data = [
    (mplPath.Path.MOVETO, (2, 10)),
    (mplPath.Path.CURVE4, (0, 100)),
    (mplPath.Path.CURVE4, (20, 100)),
    (mplPath.Path.CURVE4, (40, 150)),
    (mplPath.Path.MOVETO, (40, 150)),
    (mplPath.Path.CURVE4, (42, 45)),
    (mplPath.Path.CURVE4, (20, 30)),
    (mplPath.Path.CURVE4, (2, 10))
    ]

codes, verts = zip(*path_data)
path = mplPath.Path(verts, codes)
patch = patches.PathPatch(path, facecolor='r', alpha=0.5)

#Plot the patch and a some of the test points to visualise
fig = plt.figure()
ax = fig.add_subplot(111)
ax.add_patch(patch)
ax.set_xlim(0, 50)
ax.set_ylim(0, 200)

ax.scatter(1, 50)
ax.scatter(20, 120)
ax.scatter(20, 25)
print path.contains_point((1,50)) #This should be false but is actually true
print path.contains_point((20,120)) #This should be false but is actually true
print path.contains_point((20, 25)) #This should be false and it is

plt.show()

提前感谢您提供的任何帮助。 Python版本是2.7,Linux Mint 17.3上的Anaconda Distro

吉姆

1 个答案:

答案 0 :(得分:0)

你有一个开放的路径(额外的moveto命令)。一旦你评论出来,它就可以了。

path_data = [
    (mplPath.Path.MOVETO, (2, 10)),
    (mplPath.Path.CURVE4, (0, 100)),
    (mplPath.Path.CURVE4, (20, 100)),
    (mplPath.Path.CURVE4, (40, 150)),
  #  (mplPath.Path.MOVETO, (40, 150)),
    (mplPath.Path.CURVE4, (42, 45)),
    (mplPath.Path.CURVE4, (20, 30)),
    (mplPath.Path.CURVE4, (2, 10))
    ]