在matplotlib中使用多个补丁来剪裁图像

7

我在pylab中有一个图形,我想将其剪切到英国地图的边界上。

我还制作了一系列包含每个国家轮廓的补丁:一个用于英格兰,一个用于威尔士等。

将图形裁剪为一个补丁非常成功:

fig = plt.figure()
ax = fig.add_subplot(111)
im = ax.scatter(x,y,c = z)
ax.add_patch(patch)
im.set_clip_path(patch)

但如果我尝试为两个或更多国家进行操作,结果就什么也没有——这是可以理解的,因为情节中的任何一部分都不能同时出现在每个国家。

有人知道如何使用“OR”类型语句进行剪辑吗?(即,在此补丁内或此补丁内等情况下不要剪辑)。


我没有使用过补丁,但它们是否可以合并在一起? - Thomas K
顺便提一下,如果你正在做需要地图的事情,我想你已经找到了basemap,这是一个用于绘制地图的matplotlib扩展? - Thomas K
谢谢Thomas - 是的,我已经找到了basemap。它非常适合绘制地理定位点/国际流动等,实际上在这个例子中也可以很好地工作。但是我还没有弄清楚如何创建像KDE那样可以与地图边界对齐的图形,而且我一直在寻找更通用的解决方案。 - Hannah Fry
1个回答

8

我认为您可以通过制作多个散点图,并使用唯一的 patch 对每个散点图进行裁剪(例如,一个带有英格兰,一个带有爱尔兰等)。尽管这可能不是您所要求的,即“有人知道如何使用“ OR”类型语句进行裁剪吗?”,但它应该具有相同的效果:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches

np.random.seed(101)
x = np.random.random(100)
y = np.random.random(100)

fig = plt.figure()
ax = fig.add_subplot(111)
imForEngland = ax.scatter(x,y)
fig.savefig('beforeclip.png')
imForWales = ax.scatter(x,y)
england = patches.Circle((.75,.75),radius=.25,fc='none')
wales = patches.Circle((.25,.25),radius=.25,fc='none')
ax.add_patch(england)
ax.add_patch(wales)
imForEngland.set_clip_path(england)
imForWales.set_clip_path(wales)

fig.savefig('afterclip.png')

在应用补丁之前: enter image description here 在应用补丁之后: enter image description here

没问题 @hannah-fry,如果你觉得这是你的"答案",那么请在左边检查它。否则希望有人能给你一个更具体的答案。 - Yann
我正在尝试使用pandas绘图,但是裁剪没有完成。有人知道为什么吗? 我正在执行:imForWales = df.plot(x ='x', y='y', kind = 'scatter') - Miguel Gonzalez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接