how funcion density cmap python matplotlib contour

funcion - plot 3d python



Python: 2d diagrama de contorno de 3 listas: x, y y rho? (2)

Tengo un problema simple en python y matplotlib. Tengo 3 listas: x, y y rho con rho [i] una densidad en el punto x [i], y [i]. Todos los valores de xey están entre -1. y 1. pero no están en un orden específico.

Cómo hacer una gráfica de contorno (como con imshow) de la densidad rho (interpolada en los puntos x, y).

Muchas gracias.

EDITAR: Trabajo con arreglos grandes: x, y y rho tienen entre 10,000 y 1,000,000 de elementos


Puedes usar griddata de griddata (requiere Scipy> = 0.10), es un método basado en triangulación.

import numpy as np import matplotlib.pyplot as plt import scipy.interpolate # Generate data: for N=1e6, the triangulation hogs 1 GB of memory N = 1000000 x, y = 10 * np.random.random((2, N)) rho = np.sin(3*x) + np.cos(7*y)**3 # Set up a regular grid of interpolation points xi, yi = np.linspace(x.min(), x.max(), 300), np.linspace(y.min(), y.max(), 300) xi, yi = np.meshgrid(xi, yi) # Interpolate; there''s also method=''cubic'' for 2-D data such as here zi = scipy.interpolate.griddata((x, y), rho, (xi, yi), method=''linear'') plt.imshow(zi, vmin=rho.min(), vmax=rho.max(), origin=''lower'', extent=[x.min(), x.max(), y.min(), y.max()]) plt.colorbar() plt.show()

También hay interpolación pesada de distancia inversa, similar a RBF, pero debería funcionar mejor para un gran número de puntos: Interpolación de distancia inversa ponderada (IDW) con Python


Necesita interpolar sus valores rho . No hay una sola forma de hacerlo, y el "mejor" método depende completamente de la información a priori que debe incorporar en la interpolación.

Sin embargo, antes de entrar en una diatriba sobre los métodos de interpolación de "caja negra", una función de base radial (por ejemplo, una "placa delgada-spline" es un tipo particular de función de base radial) es a menudo una buena opción. Si tiene millones de puntos, esta implementación será ineficiente, pero como punto de partida:

import numpy as np import matplotlib.pyplot as plt import scipy.interpolate # Generate data: x, y, z = 10 * np.random.random((3,10)) # Set up a regular grid of interpolation points xi, yi = np.linspace(x.min(), x.max(), 100), np.linspace(y.min(), y.max(), 100) xi, yi = np.meshgrid(xi, yi) # Interpolate rbf = scipy.interpolate.Rbf(x, y, z, function=''linear'') zi = rbf(xi, yi) plt.imshow(zi, vmin=z.min(), vmax=z.max(), origin=''lower'', extent=[x.min(), x.max(), y.min(), y.max()]) plt.scatter(x, y, c=z) plt.colorbar() plt.show()