gpt4 book ai didi

python - 为什么 patch.contains_point() 在检查点是否在多边形内时与 patch.get_path().contains_point() 的行为不同?

转载 作者:行者123 更新时间:2023-12-05 06:59:08 28 4
gpt4 key购买 nike

对于 matplotlib.patches,patch.contains_point(xy) 方法似乎与 patch.get_path().contains_point(xy) 不同,至少在拥有之后将补丁添加到轴上。请参阅下面的区别 True/TrueTrue/False。我找不到关于这种差异的任何文档。有人知道吗?我也很难看出 contains_point() 如何确定点是否在路径内,因为在这种情况下路径的顶点是单位矩形而不是我指定的矩形。

fig, ax = plt.subplots()
rect = patches.Rectangle([0.2, 0.3], 0.8, 0.5)

pnt = [0.4, 0.45] # point inside rect
print("Before adding patch to axes:")
print(rect.get_path().vertices)
print(rect.contains_point(pnt))
print(rect.get_path().contains_point(pnt))

print("After adding patch to axes")
ax.add_patch(rect)
print(rect.get_path().vertices)
print(rect.contains_point(pnt))
print(rect.get_path().contains_point(pnt))

plt.show()

Before adding patch to axes:
[[0. 0.]
[1. 0.]
[1. 1.]
[0. 1.]
[0. 0.]]
True
True
After adding patch to axes
[[0. 0.]
[1. 0.]
[1. 1.]
[0. 1.]
[0. 0.]]
False
True

最佳答案

虽然这个问题很老,但我遇到了同样的问题并解决了它。

问题是在向轴添加补丁后,您需要在显示引用框架中给出坐标/点。这可以通过以下方式执行:

ax.transData.transform()

我在忽略导入语句的代码中添加了一行。所以代码放在这里:

import matplotlib.pyplot as plt
import matplotlib.patches as patches

fig, ax = plt.subplots()
rect = patches.Rectangle([0.2, 0.3], 0.8, 0.5)

pnt = [0.4, 0.45] # point inside rect
print("Before adding patch to axes:")
print(rect.get_path().vertices)
print(rect.contains_point(pnt))
print(rect.get_path().contains_point(pnt))

print("After adding patch to axes")
ax.add_patch(rect)
print(rect.get_path().vertices)
# added lines
pnt_in_display_coordiantes = ax.transData.transform(pnt)
print(rect.contains_point(pnt_in_display_coordiantes))
print(rect.get_path().contains_point(pnt))

plt.show()

输出:

Before adding patch to axes:
[[0. 0.]
[1. 0.]
[1. 1.]
[0. 1.]
[0. 0.]]
True
True
After adding patch to axes
[[0. 0.]
[1. 0.]
[1. 1.]
[0. 1.]
[0. 0.]]
True
True

更多信息:https://matplotlib.org/stable/tutorials/advanced/transforms_tutorial.html

关于python - 为什么 patch.contains_point() 在检查点是否在多边形内时与 patch.get_path().contains_point() 的行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64454891/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com