python numpy matplotlib scipy contour

plot title python



matplotlib-extracción de datos de líneas de contorno (3)

Estoy enfrentando un problema similar y tropecé con esta discusión de la lista matplotlib .

Básicamente, es posible eliminar el trazado y llamar a las funciones subyacentes directamente, no muy conveniente, pero posible. La solución tampoco es precisa en píxeles, ya que probablemente haya alguna interpolación en el código subyacente.

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

Me gustaría obtener datos de un solo contorno de datos 2D espaciados uniformemente (una imagen similar a los datos).

Basado en el ejemplo encontrado en una pregunta similar: ¿Cómo puedo obtener los valores (x, y) de la línea trazada por un diagrama de contorno (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()

El resultado de esta llamada a cs.collections[0].get_paths() es:

[Path([[ 4. 1.625 ] [ 3.25 2. ] [ 3. 2.16666667] [ 2.16666667 3. ] [ 2. 3.25 ] [ 1.625 4. ]], None)]

En función de las parcelas, este resultado tiene sentido y parece ser una colección de pares (y, x) para la línea de contorno.

Además de realizar un bucle manual sobre este valor de retorno, extraer las coordenadas y ensamblar matrices para la línea, ¿hay formas mejores de recuperar datos de un objeto matplotlib.path ? ¿Hay riesgos a tener en cuenta al extraer datos de un matplotlib.path ?

Alternativamente, ¿hay alternativas dentro de matplotlib o mejor aún numpy / scipy para hacer algo similar? Lo ideal sería obtener un vector de alta resolución de pares (x, y) que describa la línea, que podría usarse para un análisis posterior, ya que, en general, mis conjuntos de datos no son pequeños ni simples como el ejemplo anterior.


Para un camino determinado, puedes obtener los puntos de esta manera:

p = cs.collections[0].get_paths()[0] v = p.vertices x = v[:,0] y = v[:,1]


desde: http://matplotlib.org/api/path_api.html#module-matplotlib.path

Los usuarios de los objetos Path no deberían acceder directamente a los vértices y códigos de las matrices. En su lugar, deberían usar iter_segments () para obtener los pares de vértices / códigos. Esto es importante, ya que muchos objetos Path, como optimización, no almacenan códigos, pero tienen un valor predeterminado proporcionado por iter_segments ().

De lo contrario, no estoy seguro de cuál es tu pregunta. [Zip] es una función integrada útil a veces cuando se trabaja con coordenadas. 1