2013-06-26 3 views
1

Dans matplotlib, il est possible d'obtenir les pixels à l'intérieur d'un polygone en utilisant matplotlib.nxutils.points_inside_poly, à condition que les vertices soient préalablement définis.Obtenir des pixels à l'intérieur d'un patch

Comment pouvez-vous obtenir les points à l'intérieur d'un patch, par ex. une ellipse? Le problème: si vous définissez une ellipse matplotlib, elle a une méthode .get_verts(), mais cela renvoie les sommets dans les unités de figure (au lieu de données).

On pourrait faire:

# there has to be a better way to do this, 
# but this gets xy into the form used by points_inside_poly 
xy = np.array([(x,y) for x,y in zip(pts[0].ravel(),pts[1].ravel())]) 
inds = np.array([E.contains_point((x,y)) for x,y in xy], dtype='bool') 

Cependant, cela est très lent, car il tourne en boucle en python au lieu de C.

+0

Vous pouvez utiliser les transformations pour changer les unités en données et en faire un poly, je pense. – tacaswell

+0

@tcaswell - Je pense que c'est vrai. Dans ce cas, la question devrait être interprétée comme "Comment utiliser les transformations pour convertir les verts ..." – keflavich

+1

Je n'ai pas le temps d'écrire une réponse correcte (désolé), mais ceci http://matplotlib.org /users/transforms_tutorial.html devrait vous aider à trouver la réponse. – tacaswell

Répondre

2

utilisation ax.transData.transform() pour transformer vos points, puis utilisez points_inside_poly():

import pylab as pl 
import matplotlib.patches as mpatches 
from matplotlib.nxutils import points_inside_poly 
import numpy as np 

fig, ax = pl.subplots(1, 1) 
ax.set_aspect("equal") 
e = mpatches.Ellipse((1, 2), 3, 1.5, alpha=0.5) 
ax.add_patch(e) 
ax.relim() 
ax.autoscale() 

p = e.get_path() 
points = np.random.normal(size=(1000, 2)) 
polygon = e.get_verts() 
tpoints = ax.transData.transform(points) 
inpoints = points[points_inside_poly(tpoints, polygon)] 
sx, sy = inpoints.T 
ax.scatter(sx, sy) 

résultat:

enter image description here

Questions connexes