Matplotlib set_clip_path需要绘制补丁

时间:2014-09-05 14:48:44

标签: python matplotlib

我刚刚发现了一种很好的方法来创建一个剪裁到任意多边形区域的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()

Resulting plot

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

有什么想法吗?

1 个答案:

答案 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)

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