2011-11-14 21 views
5

Tengo un diagrama en pylab que quiero recortar en los bordes de un mapa del Reino Unido.Recortar una imagen usando varios parches en matplotlib

También he hecho una serie de parches que contienen los contornos de cada país: uno para Inglaterra, uno para Gales etc.

la saturación de la parcela de un parche funciona muy bien:

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

Pero si trato de hacerlo por más de uno, no me deja nada, comprensiblemente, ya que ninguna parte de la trama se encuentra dentro de cada país simultáneamente.

¿Alguien sabe cómo puedo recortar usando una declaración de tipo 'OR'? (es decir, no recorte si está dentro de este parche o este, etc.).

+0

No he trabajado con parches, pero ¿hay alguna forma de que se puedan agregar? –

+0

Por cierto, si estás haciendo algo que requiere un mapa, supongo que has encontrado el mapa base, una extensión matplotlib para dibujar mapas. –

+0

Gracias Thomas - sí, he encontrado el mapa base. Es ideal para trazar puntos geolocalizados/flujos entre países, etc., y en realidad funcionaría bien en este ejemplo. Byt todavía no he resuelto cómo crear trazados como los de KDE, que pueden alinearse con los límites del mapa, y he estado buscando una solución más general. –

Respuesta

6

Creo que puede hacer esto haciendo múltiples diagramas de dispersión, cortando cada uno con un parche único (por ejemplo, uno tiene Inglaterra, otro tiene Irlanda, etc.). Aunque esto podría no ser lo que usted pidió, es decir, "¿Alguien sabe cómo puedo cortar using tipo una 'O'?", Se debe tener el mismo efecto:

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

Antes de que los parches: enter image description here Después de los parches: enter image description here

+0

Gracias Yann! Gran idea. –

+0

No hay problema @ hannah-fry, si considera que su "respuesta", entonces, por favor, mire a la izquierda. De lo contrario, con suerte alguien puede darle una respuesta más específica. – Yann

Cuestiones relacionadas