2011-11-14 15 views
5

Ho una trama in pylab che voglio ritagliare ai bordi di una mappa del Regno Unito.Ritaglia un'immagine usando diverse patch in matplotlib

Ho anche fatto una serie di patch che contengono i contorni di ogni paese: uno per l'Inghilterra, una per il Galles, ecc

ritaglio la trama un cerotto funziona brillantemente:

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

Ma se provo a farlo per più di una, non mi lascia nulla - comprensibilmente, dal momento che nessuna parte della trama si trova all'interno di ogni paese contemporaneamente.

Qualcuno sa come posso ritoccare usando una frase di tipo "OR"? (ad esempio non clip se all'interno di questa patch o questa ecc.).

+0

Non ho lavorato con le patch, ma c'è un modo in cui possono essere aggiunti insieme? –

+0

Per inciso, se stai facendo qualcosa che richiede una mappa, presumo tu abbia trovato la mappa di base, un'estensione matplotlib per disegnare mappe? –

+0

Grazie Thomas, sì, ho trovato la mappa di base. È ottimo per tracciare punti geolocalizzati/flussi tra paesi, ecc. E in effetti andrebbe bene in questo esempio. Non ho ancora capito come creare trame come quelle di KDE che possono allinearsi con il limite della mappa, e ho cercato una soluzione più generale. –

risposta

6

Penso che si possa fare creando più diagrammi di dispersione, tagliando ognuno con una patch unica (ad esempio, uno ha l'Inghilterra, uno ha l'Irlanda, ecc.). Anche se questo potrebbe non essere quello che hai chiesto, vale a dire "qualcuno sa come posso ritagliare utilizzando tipo di istruzione di un 'O'?", Dovrebbe avere lo stesso effetto:

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') 

Prima le patch: enter image description here Dopo le patch: enter image description here

+0

Grazie Yann! Grande idea. –

+0

Nessun problema @ hannah-fry, se consideri la tua "risposta", per favore controlla a sinistra. Altrimenti si spera che qualcuno possa darti una risposta più specifica. – Yann

Problemi correlati