我刚刚发现了一种很好的方法来创建一个剪裁到任意多边形区域的Matplotlib填充轮廓图。该方法需要在Matplotlib的set_clip_path(patch)
函数返回的QuadContourSet中的每个PathCollection实例上调用contourf()
。 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'
是一个很好的解决方法,但那里的乐趣在哪里?
有什么想法吗?
答案 0 :(得分:3)
如果没有将补丁添加到轴上,则根据应该处理的变换无法知道。通过将其添加到轴,您可以隐含地将变换设置为添加到的轴的数据变换
如果你想象一个数字上有几个轴,我想这种必要性就变得清晰了。然后mpatches.PathPatch
可能会用于任何这些轴。
您可以通过将面部和边缘颜色设置为"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)
在这种情况下,不需要将其添加到轴上。