Python Matplotlib set_clip_路径需要打印面片

Python Matplotlib set_clip_路径需要打印面片,python,matplotlib,Python,Matplotlib,我刚刚发现了一种很好的方法,可以创建一个Matplotlib填充的等高线图,并将其剪裁到任意多边形区域。该方法需要对Matplotlib的contourf()函数返回的QuadContourSet中的每个PathCollection实例调用set\u clip\u path(patch)。MWE: import matplotlib.pyplot as plt import numpy as np import matplotlib.patches as mpatches import matp

我刚刚发现了一种很好的方法,可以创建一个Matplotlib填充的等高线图,并将其剪裁到任意多边形区域。该方法需要对Matplotlib的
contourf()
函数返回的QuadContourSet中的每个PathCollection实例调用
set\u clip\u 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()

我对一个方面感到困惑:如果我注释掉绘制面片的线条,那么所有的剪辑都不起作用,我最终会得到一个空白的绘图。我假设在PathCollection上使用补丁调用set_clip_path方法时,补丁必须已添加到轴,但我不明白为什么。为补丁创建设置
edgecolor='none'
是一个很好的解决方法,但其中的乐趣何在


有什么想法吗?

如果面片未添加到轴,则无法知道应根据哪个变换处理面片。通过将其添加到轴,可以隐式地将变换设置为其添加到的轴的数据变换。
如果你想象一个图形上有多个轴,我想这一必要性就很明显了。然后,
mpatches.PathPatch
可能会用于这些轴中的任何一个

通过将面和边颜色设置为
“none”

或者把它一起看不见

patch = mpatches.PathPatch(path, visible=False)
如果确实不想将面片添加到轴,可以手动设置所需的变换

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

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

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

我怀疑这与在显示空间中进行的剪裁有关,除非绘制面片,否则它只有数据空间坐标。我花了一段时间才弄明白为什么我有一个空白图,事实上,正如你所描述的那个酒杯,我需要在其他一切出现之前,画出一个想象中的无色区域。非常意外的行为。对于imshow,您必须指定剪裁,而不是一次,而是三次:
patch = mpatches.PathPatch(path, transform=ax.transData)

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