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