Клип изображение, используя несколько патчей в Matplotlib - PullRequest
5 голосов
/ 14 ноября 2011

У меня есть сюжет в 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)

Но если я попытаюсь сделать это для более чем одного, это не оставит меня ни с чем - по понятным причинам, поскольку ни одна часть сюжета не находится внутри каждой страны одновременно.

Кто-нибудь знает, как я могу обрезать, используя оператор типа «ИЛИ»?(т.е. не обрезать, если в этом патче или этот и т. д.).

1 Ответ

6 голосов
/ 15 ноября 2011

Я думаю, что вы можете сделать это, создав несколько графиков рассеяния, обрезая каждый из них уникальным патчем (например, у кого-то есть Англия, у кого-то Ирландия и т. Д.).Хотя это может быть не то, о чем вы просили, т. Е. «Кто-нибудь знает, как я могу обрезать, используя оператор типа« ИЛИ »?», Это должно иметь тот же эффект:

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

...