matplotlib-extraction de données à partir des courbes de niveau
je voudrais obtenir des données à partir d'un contour unique de données 2D uniformément espacées (une image-comme des données).
basé sur l'exemple trouvé dans une question similaire: Comment puis-je obtenir les valeurs (x,y) de la ligne qui est tracée par un tracé de contour (matplotlib)?
>>> import matplotlib.pyplot as plt
>>> x = [1,2,3,4]
>>> y = [1,2,3,4]
>>> m = [[15,14,13,12],[14,12,10,8],[13,10,7,4],[12,8,4,0]]
>>> cs = plt.contour(x,y,m, [9.5])
>>> cs.collections[0].get_paths()
le résultat de cet appel à cs.collections[0].get_paths()
est:
[Path([[ 4. 1.625 ]
[ 3.25 2. ]
[ 3. 2.16666667]
[ 2.16666667 3. ]
[ 2. 3.25 ]
[ 1.625 4. ]], None)]
basé sur les placettes, ce résultat a du sens et semble être collection de (y,x) paires pour la ligne de contour.
mis à part la boucle manuelle au-dessus de cette valeur de retour, l'extraction des coordonnées et l'assemblage des tableaux pour la ligne, y a-t-il de meilleures façons de récupérer des données à partir d'un objet matplotlib.path
? Sont-il des pièges à éviter lors de l'extraction de données à partir d'un matplotlib.path
?
Sinon, y a-t-il des alternatives dans matplotlib
ou mieux encore numpy
/ scipy
pour faire une chose similaire? Idéal la chose serait d'obtenir un vecteur de haute résolution de (x,y) paires décrivant la ligne, qui pourrait être utilisé pour une analyse plus poussée, car en général mes ensembles de données ne sont pas un petit ou simple comme l'exemple ci-dessus.
3 réponses
Pour un chemin donné, vous pouvez obtenir les points comme ceci:
p = cs.collections[0].get_paths()[0]
v = p.vertices
x = v[:,0]
y = v[:,1]
de: http://matplotlib.org/api/path_api.html#module-matplotlib.path
les utilisateurs d'objets Path ne doivent pas accéder aux tableaux de sommets et de codes directement. À la place, ils devraient utiliser iter_segments () pour obtenir les couples vertex / code. C'est important, car de nombreux objets Path, comme optimisation, ne stockent pas les codes, mais qui ont un défaut fournis par iter_segments().
autrement, Je ne suis pas vraiment sûr de ce que votre question Est. [Zip] est une fonction intégrée parfois utile lorsqu'on travaille avec des coordonnées. 1
je suis confronté à un problème similaire, et est tombé sur cette discussion de la liste matplotlib .
fondamentalement, il est possible de supprimer le tracé et appeler les fonctions sous-jacentes directement, pas super commode, mais possible. La solution n'est pas non plus précise en pixel, car il y a probablement une interpolation en cours dans le code sous-jacent.
import matplotlib.pyplot as plt
import matplotlib._cntr as cntr
import scipy as sp
data = sp.zeros((6,6))
data[2:4,2:4] = 1
plt.imshow(data,interpolation='none')
level=0.5
X,Y = sp.meshgrid(sp.arange(data.shape[0]),sp.arange(data.shape[1]))
c = cntr.Cntr(X, Y, data.T)
nlist = c.trace(level, level, 0)
segs = nlist[:len(nlist)//2]
for seg in segs:
plt.plot(seg[:,0],seg[:,1],color='white')
plt.show()