Diagtwig de contorno de Matplotlib con líneas de contorno que se cruzan

Estoy tratando de hacer un diagtwig de contorno de los siguientes datos utilizando matplotlib en python. Los datos son de esta forma.

# xy height 77.23 22.34 56 77.53 22.87 63 77.37 22.54 72 77.29 22.44 88 

En realidad, los datos constan de casi 10,000 puntos, que estoy leyendo de un archivo de entrada. Sin embargo, el conjunto de valores posibles distintos de z es pequeño (dentro de 50-90, enteros), y deseo tener una línea de contorno para cada z diferente.

Aquí está mi código –

 import matplotlib import numpy as np import matplotlib.cm as cm import matplotlib.mlab as mlab import matplotlib.pyplot as plt import csv import sys # read data from file data = csv.reader(open(sys.argv[1], 'rb'), delimiter='|', quotechar='"') x = [] y = [] z = [] for row in data: try: x.append(float(row[0])) y.append(float(row[1])) z.append(float(row[2])) except Exception as e: pass #print e X, Y = np.meshgrid(x, y) # (I don't understand why is this required) # creating a 2D array of z whose leading diagonal elements # are the z values from the data set and the off-diagonal # elements are 0, as I don't care about them. z_2d = [] default = 0 for i, no in enumerate(z): z_temp = [] for j in xrange(i): z_temp.append(default) z_temp.append(no) for j in xrange(i+1, len(x)): z_temp.append(default) z_2d.append(z_temp) Z = z_2d CS = plt.contour(X, Y, Z, list(set(z))) plt.figure() CB = plt.colorbar(CS, shrink=0.8, extend='both') plt.show() 

Aquí está la ttwig de una pequeña muestra de datos – introduzca la descripción de la imagen aquí

A continuación se muestra una vista detallada de una de las regiones de la gráfica anterior (observe las líneas que se superponen / se cruzan): introduzca la descripción de la imagen aquí

No entiendo por qué no parece una ttwig de contorno. Las líneas se cruzan, lo que no debería ocurrir. ¿Qué puede estar posiblemente mal? Por favor ayuda.

Trate de usar el siguiente código. Esto podría ayudarte, es lo mismo que estaba en el Libro de cocina :

 import numpy as np import matplotlib.pyplot as plt from matplotlib.mlab import griddata # with this way you can load your csv-file really easy -- maybe you should change # the last 'dtype' to 'int', because you said you have int for the last column data = np.genfromtxt('output.csv', dtype=[('x',float),('y',float),('z',float)], comments='"', delimiter='|') # just an assigning for better look in the plot routines x = data['x'] y = data['y'] z = data['z'] # just an arbitrary number for grid point ngrid = 500 # create an array with same difference between the entries # you could use x.min()/x.max() for creating xi and y.min()/y.max() for yi xi = np.linspace(-1,1,ngrid) yi = np.linspace(-1,1,ngrid) # create the grid data for the contour plot zi = griddata(x,y,z,xi,yi) # plot the contour and a scatter plot for checking if everything went right plt.contour(xi,yi,zi,20,linewidths=1) plt.scatter(x,y,c=z,s=20) plt.xlim(-1,1) plt.ylim(-1,1) plt.show() 

Creé un archivo de salida de muestra con una distribución gaussiana en 2D. Mi resultado con el uso del código de arriba:

Distribución gaussiana en 2D.

NOTA:

Tal vez notaste que los bordes están un poco recortados. Esto se debe al hecho de que la griddata función crea matrices enmascaradas. Me refiero a que el borde de la ttwig es creado por los puntos exteriores. Todo lo que está fuera de la frontera no está allí. Si sus puntos estarían en una línea, entonces no tendrá ningún contorno para trazar. Esto es algo lógico. Lo menciono, causa de tus cuatro puntos de datos publicados. Parece probable que tengas este caso. Tal vez no lo tengas =)

ACTUALIZAR

Edité el código un poco. Su problema probablemente fue que no resolvió correctamente las dependencias de su archivo de entrada. Con el siguiente código la ttwig debería funcionar correctamente.

 import numpy as np import matplotlib.pyplot as plt from matplotlib.mlab import griddata import csv data = np.genfromtxt('example.csv', dtype=[('x',float),('y',float),('z',float)], comments='"', delimiter=',') sample_pts = 500 con_levels = 20 x = data['x'] xmin = x.min() xmax = x.max() y = data['y'] ymin = y.min() ymax = y.max() z = data['z'] xi = np.linspace(xmin,xmax,sample_pts) yi = np.linspace(ymin,ymax,sample_pts) zi = griddata(x,y,z,xi,yi) plt.contour(xi,yi,zi,con_levels,linewidths=1) plt.scatter(x,y,c=z,s=20) plt.xlim(xmin,xmax) plt.ylim(ymin,ymax) plt.show() 

Con este código y su pequeña muestra obtengo el siguiente gráfico:

La parcela de muestra

Trate de usar mi fragmento y solo cámbielo un poco. Por ejemplo, tuve que cambiar para el archivo csv de muestra dado el delimitador desde | a,. El código que escribí para usted no es realmente bueno, pero está escrito directamente en el prólogo.

Lo siento por la respuesta tardía.