Superficie de interpolación TIN 3D con la versión actual de matplotlib en Python

En un post bastante antiguo se consideró la generación de una superficie de interpolación TIN 3D con los módulos numpy, matplotlib y visvis de Python. Sin embargo, como el método ‘Natural Neighbor interpolation’ de matplotlib.mlab.griddata ha sido removido de maplotlib por motivos de licencia el código, tal como está allí expuesto, probablemente no funcionará.

El mensaje de error será algo similar a lo siguiente:

Traceback (most recent call last):
File “interpol_3d.py”, line 22, in
Z = griddata(x, y, z, xi, yi)
File “/usr/local/lib/python2.7/dist-packages/matplotlib/mlab.py”, line 3387, in griddata
“To use interp=’nn’ (Natural Neighbor interpolation) in ”
RuntimeError: To use interp=’nn’ (Natural Neighbor interpolation) in griddata, natgrid must be installed. Either install it from http://github.com/matplotlib/natgrid or use interp=’linear’ instead.

donde se señala que el método de interpolación ‘Natural Neighbor interpolation’ tiene que ser instalado de http://github.com/matplotlib/natgrid o, en su defecto, emplear el método de interpolación ‘linear’. Aplicando esta última sugerencia de corrección en el código siguiente:

#!/usr/bin/env python
#-* coding: utf-8
  
#Librerías
import numpy as np
from matplotlib.mlab import griddata
from mpl_toolkits.mplot3d.axes3d import *
from matplotlib import cm
import matplotlib.pyplot as plt
  
#Arreglos de puntos: ahora son 16!
x=[0,1,2,3,4,5,0,0,0,0,0,1,2,3,4,5]
y=[0,0,0,0,0,0,1,2,3,4,5,1,2,3,4,5]
z=[1,5,1,3,2,1,1,7,1,4,2,1,2,2,2,1]
  
# construcción de la grilla 2D
xi = np.linspace(min(x), max(x))
yi = np.linspace(min(y), max(y))
X, Y = np.meshgrid(xi, yi)
  
# interpolación
Z = griddata(x, y, z, xi, yi, interp='linear')
  
#Visualización con Matplotlib
fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet,linewidth=1, antialiased=True)
plt.plot
  
plt.show() #Para que la ventana de visualización permanezca estática

su ejecución produce el resultado a continuación donde la superficie ahora tiene transiciones lineales abruptas sin la suavidad característica de las líneas curvas.

interpol1

Por ello, procedimos a instalar, como superusaurio, mediante el comando:

python setup.py install

el módulo natgrid que se encontraba dentro de la carpeta resultante de desempaquetar natgrid-master.zip; el cual se bajó desde http://github.com/matplotlib/natgrid. La ejecución del código original ahora si produce el resultado esperado; tal como se evidencia en la imagen siguiente:

interpol2

No obstante, en la página oficial de maplotlib señalan alternativas a la ausencia del método ‘Natural Neighbor interpolation’ en natgrid con el uso de scipy.interpolate.griddata. Empleando tales sugerencias en el código siguiente con la opción ‘cubic’ (‘nearest’ produjo error de ejecución):

#!/usr/bin/env python
#-* coding: utf-8
  
#Librerías
import numpy as np
#from matplotlib.mlab import griddata
from scipy.interpolate import griddata
from mpl_toolkits.mplot3d.axes3d import *
from matplotlib import cm
import matplotlib.pyplot as plt
  
#Arreglos de puntos: ahora son 16!
x=[0,1,2,3,4,5,0,0,0,0,0,1,2,3,4,5]
y=[0,0,0,0,0,0,1,2,3,4,5,1,2,3,4,5]
z=[1,5,1,3,2,1,1,7,1,4,2,1,2,2,2,1]
  
# construcción de la grilla 2D
xi = np.linspace(min(x), max(x))
yi = np.linspace(min(y), max(y))
X, Y = np.meshgrid(xi, yi)

# interpolación
#Z = griddata(x, y, z, xi, yi, interp='linear')
Z = griddata((x, y), z, (xi[None,:], yi[:,None]), method='cubic')
  
#Visualización con Matplotlib
fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet,linewidth=1, antialiased=True)
plt.plot
  
plt.show() #Para que la ventana de visualización permanezca estática

se obtuvo el resultado de la imagen a continuación (con ‘linear’ se obtiene el mismo resultado ya referido con anterioridad):

interpol3

Anuncios
Esta entrada fue publicada en Código Python, SIG. Guarda el enlace permanente.

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s