为什么绘制matplotlib补丁会破坏contains_point?

时间:2016-09-19 23:46:05

标签: python matplotlib

运行以下代码段后,

import matplotlib.pyplot as plt
from matplotlib.patches import Ellipse

plotted_ellipse = Ellipse((0, 0), 10, 10)
unplotted_ellipse = Ellipse((0, 0), 10, 10)

fig = plt.figure()
ax = fig.add_subplot(111)

ax.add_patch(plotted_ellipse)

ax.set_aspect('equal')
ax.set_xlim(-10, 10)
ax.set_ylim(-10, 10)

使用contains_point方法时,我得到以下结果

In [6]: plotted_ellipse.contains_point((0, 0))
Out[6]: False

In [7]: unplotted_ellipse.contains_point((0, 0))
Out[7]: True

这对我没有意义。这是偶然的错误吗?或者是否有一种首选方法来测试补丁对象是否包含点?

使用matplotlib版本1.5.1

1 个答案:

答案 0 :(得分:1)

这是因为您正在检查数据坐标中绘制的椭圆中的点,而当您将路径添加到 ax 时,其坐标将转换为显示坐标。 根据{{​​3}}:

<块引用>

检查转换后的补丁的惯例源于这样一个事实,即该方法主要用于检查显示坐标(例如来自鼠标事件)是否在补丁内。如果你想用数据坐标做上面的检查,你必须先正确地变换它们

因此,如果您想检查数据坐标中的某个点,则必须先将其转换为显示坐标:

point = plotted_ellipse.get_transform().transform((0,0))
print(plotted_ellipse.contains_point(point))
>>> True

有关坐标系的说明,请参阅 docs