Matplotlib set_clip_path需要绘制补丁

Gab*_*iel 8 python matplotlib

我刚刚发现了一种很好的方法来创建一个剪裁到任意多边形区域的Matplotlib填充轮廓图.该方法需要调用set_clip_path(patch)Matplotlib contourf()函数返回的QuadContourSet中的每个PathCollection实例.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()
Run Code Online (Sandbox Code Playgroud)

结果情节

我对一个方面感到困惑:如果我注释掉绘制补丁的行,那么剪辑都不起作用,我最终得到一个空白的情节.我假设在使用PathCollection上的补丁调用set_clip_path方法时,补丁必须已添加到轴中,但我不明白为什么.edgecolor='none'修补程序创建的设置是一个很好的解决方法,但那里的乐趣在哪里?

有什么想法吗?

Imp*_*est 7

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

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

patch = mpatches.PathPatch(path, facecolor='none', edgecolor='none')
Run Code Online (Sandbox Code Playgroud)

或者把它完全隐形,

patch = mpatches.PathPatch(path, visible=False)
Run Code Online (Sandbox Code Playgroud)

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

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

for col in cont.collections:
    col.set_clip_path(patch)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,不需要将其添加到轴中。