uso de matlab meshgrid

Lo siento, tengo que seguir volviendo al problema de la cuadrícula de datos espaciados irregularmente. Parece que no veo respuestas claras a las preguntas sobre cómo cuadrar datos en una cuadrícula regular y la documentación del software para mí es buena para quienes ya lo saben. Tengo datos de x, y, z en 29 puntos, con un encabezado “Lon Lat Z”. para trazar contornos con estos datos aquí es lo que hago:

  1. Después de leer los datos, haga una cuadrícula regular de 300 por 300 puntos sobre la cual interpolar

    numcols, numrows = 300, 300 xi = np.linspace(data.Lon.min(), data.Lon.max(), numcols) yi = np.linspace(data.Lat.min(), data.Lat.max(), numcols) xi, yi = np.meshgrid(xi, yi) 

    Imprimir xi e imprimir yi en este punto me da xey según mis datos, interpolado más de 300×300 puntos.

  2. Interpolar los datos sobre la grilla creada arriba

     x, y, z = data.Lon.values, data.Lat.values, data.Z.values zi = griddata(x, y, z, xi, yi) 

    En este punto si print zi me sale

    [[- – – …, – – -]
    [- – – …, – – -]
    [- – – …, – – -]
    …,
    [- – – …, – – -]
    [- – – …, – – -]
    [- – – …, – – -]]

Esperaba ver valores de z interpolados. También tengo un objeto de mapa definido para ser superpuesto por contornos. La función de trazado me da figuras separadas, para el mapa base y para los contornos, con los valores de contorno correctos. Mi pregunta es ¿por qué obtengo valores en blanco para los contornos y cómo se trazan correctamente? Para la integridad aquí es mi función de trazado

 fig=plt.figure(figsize=(8,4.5)) im = plt.contourf(xi, yi, zi) plt.show() 

Dos plots aparecen (un mapa base y contornos de lado a lado)

Cualquier ayuda por favor.

Lo siguiente debería funcionar:

 numcols, numrows = 300, 300 xi = np.linspace(data.Lon.min(), data.Lon.max(), numrows) yi = np.linspace(data.Lat.min(), data.Lat.max(), numcols) xi, yi = np.meshgrid(xi, yi) x, y, z = data.Lon.values, data.Lat.values, data.Z.values points = np.vstack((x,y)).T values = z wanted = (xi, yi) zi = griddata(points, values, wanted) 

Entonces, la última línea es cómo funciona griddata (asumiendo que usas scipy.interpolate.griddata ). El problema que tienes es que parece que le griddata cinco argumentos a griddata , mientras que si miro http://docs.scipy.org/doc/ scipy / reference / generic / scipy.interpolate.griddata.html # scipy.interpolate.griddata Dice lo siguiente:

 scipy.interpolate.griddata(points, values, xi, method='linear', fill_value=nan) 

Entonces, en su caso, dar cinco argumentos es donde sale mal, supongo (confirme si funciona si lo hace así, ya que no tengo sus datos, así que no puedo probar si dan el resultado correcto).

Entonces, en su caso, sus puntos donde se conocen los valores son la x, mientras que los valores que se conocen en ese punto son los valores y, y los puntos donde desea conocerlos están en los valores z. No tengo idea de cómo el method='linear' hace frente a su argumento, y el valor de fill_value que cede también es malo, por lo que debería dar las entradas correctas (que creo que son correctas de la forma en que las formulé), y luego debería funcionar. Correcto.

editar: lea sus datos como un texto, y escribió el siguiente código. ¿Puedes ejecutarlo para ver si ese es el resultado que querías?

 import numpy as np from scipy.interpolate import griddata class d(): def __init__(self): A0 = open("test.txt","rb") # i just copypasted your data into a txt (without first row), and reading it in in this class, so that the names are the same as yours A1 = A0.readlines() A = np.zeros((len(A1),3)) for i, l in enumerate(A1): li = l.split() A[i,0] = float(li[0]) A[i,1] = float(li[1]) A[i,2] = float(li[2]) self.Lon = A[:,0] self.Lat = A[:,1] self.Z = A[:,2] data = d() numcols, numrows = 30, 30 xi = np.linspace(data.Lon.min(), data.Lon.max(), numrows) yi = np.linspace(data.Lat.min(), data.Lat.max(), numcols) xi, yi = np.meshgrid(xi, yi) x, y, z = data.Lon, data.Lat, data.Z points = np.vstack((x,y)).T values = z wanted = (xi, yi) zi = griddata(points, values, wanted) import pylab as plt fig = plt.figure(0, figsize=(8,4.5)) im = plt.contourf(xi, yi, zi) plt.colorbar() fig2 = plt.figure(1, figsize=(8,4.5)) im = plt.scatter(xi, yi, c= zi) plt.colorbar() plt.show()