gpt4 book ai didi

python - Matplotlib set_clip_path 需要绘制补丁

转载 作者:太空狗 更新时间:2023-10-29 21:55:04 28 4
gpt4 key购买 nike

我刚刚发现了一种创建裁剪到任意多边形区域的 Matplotlib 填充等高线图的好方法。该方法需要在 Matplotlib 的 contourf() 函数返回的 QuadContourSet 中的每个 PathCollection 实例上调用 set_clip_path(patch)。 MWE:

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.patches as mpatches
import matplotlib.path as mpath

# some arbitrary data to plot
xx, yy = np.meshgrid(np.linspace(-5, 5, 20), np.linspace(-10, 10, 20), copy=False)
zz = np.sqrt(xx ** 2 + yy ** 2)

poly_verts = [
(0, 0),
(-4, 7),
(-4, -7),
(4, -7),
(4, 7),
(0, 0)
]
poly_codes = [mpath.Path.MOVETO] + (len(poly_verts) - 2) * [mpath.Path.LINETO] +
mpath.Path.CLOSEPOLY]

# create a Path from the polygon vertices
path = mpath.Path(poly_verts, poly_codes)

# create a Patch from the path
patch = mpatches.PathPatch(path, facecolor='none', edgecolor='k')

plt.figure()
ax = plt.gca()
cont = plt.contourf(xx, yy, zz, 50)

# add the patch to the axes
ax.add_patch(patch) ## TRY COMMENTING THIS OUT
for col in cont.collections:
col.set_clip_path(patch)

plt.show()

Resulting plot

我对一个方面感到困惑:如果我注释掉绘制补丁的那一行,那么任何剪裁都不起作用,我最终得到一个空白图。我推测当调用带有 PathCollection 上的补丁的 set_clip_path 方法时,补丁一定已经添加到轴上,但我不明白为什么。为补丁创 build 置 edgecolor='none' 是一个很好的解决方法,但这样做有什么乐趣呢?

有什么想法吗?

最佳答案

如果未将补丁添加到坐标区,则无法知道应该根据哪个变换处理它。通过将其添加到坐标区,您可以隐式地将变换设置为它所添加到的坐标区的数据变换。
我想如果你想象在一个图形上有几个轴,这种必要性就会变得很清楚。然后 mpatches.PathPatch 可能会用于任何这些轴。

您确实可以通过将 face- 和 edgecolor 设置为 "none" 来设置补丁不可见

patch = mpatches.PathPatch(path, facecolor='none', edgecolor='none')

或者把它完全隐藏起来,

patch = mpatches.PathPatch(path, visible=False)

如果你真的想摆脱向轴添加补丁,你可以手动设置所需的转换

patch = mpatches.PathPatch(path, transform=ax.transData)

for col in cont.collections:
col.set_clip_path(patch)

在这种情况下,不需要将它添加到坐标区。

关于python - Matplotlib set_clip_path 需要绘制补丁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25688573/

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