26.1 Curvas de nivel (contornos)
Si se observa un mapa topográfico de curvas de nivel, cada curva representa puntos en donde no se pierde ni gana elevación. La curva presenta una elevación constante del terreno. Si se caminara perpendicular a una curva de nivel, se estaría yendo cuesta abajo o cuesta arriba. Entre más juntas un par de curvas de nivel, mayor pendiente hay, es decir, se gana o pierde elevación rápidamente. Entre más separadas, mayor tiempo toma ganar o perder elevación.
Visualizar mapas de esta manera está relacionado con la visualización científica. Pero la misma idea puede ser utilizada para representar otro tipo de conceptos en que se representa un campo 3D en 2D. Un buen ejemplo son las distribuciones de probabilidad conjunta de dos variables. Las curvas de nivel de una función multivariante son análogas a las curvas de nivel del mapa topográfico. Son curvas de elevación constante. El idioma gráfico se denomina isocontorno.
Realicemos un ejemplo sencillo.
Se generan dos vectores con distribución de probabilidad normal, con media 10 y dispersión 1:
Por separado, se ven dos curvas normales
## Text(0.5, 0.98, 'Par de funciones de distribución normal')
## <Axes: ylabel='Density'>
## <Axes: ylabel='Density'>

Observe que la curva de la derecha no se conforma totalmente a una curva normal. La aleatoriedad permite que esto ocurra. Por supuesto, a mayor número de puntos, mayor conformidad es esperable.
Ejercicio. Aumente el número de puntos y observe si cambia la forma.
Obsérvese que los geomas de densidad toman unos pocos puntos discretos en el eje x y le añaden puntos en el eje y, convirtiendo datos contables en 1D en datos incontables en el espacio contínuo en 2D.
La función kdeplot de la librería seaborn realiza un cálculo de cómo se ve la densidad de un conjunto de puntos: el nombre de la función proviene de kernel density. Toma cada punto y supone que es la media de una función de distribución de probabilidad teórica, por ejemplo, una normal. Es decir, genera una ecuación de una función de distribución normal con cierta dispersión alrededor del punto. Lo realiza para cada punto y luego suma todas las funciones de distribución.
En vez de una normal se pueden asociar otro tipo de distribuciones simétricas.
Este par de curvas representan la distribución de densidad de probabilidad en 2D. Pero una perspectiva bivariada, es decir, con dos variables, presenta una distribución de densidad de probabilidad en 3D. Una opción de representación son los isocontornos, como ya se ha explicado:
## <Axes: >

En un espacio tridimensional, los datos indican las cordenadas de (x, y), y la altura z representa la densidad de puntos. Los datos simulados son más densos alrededor de la media, el valor 10. Obsérvese en la visualización que tanto en x como en y el centro está en 10. Las curvas de nivel están más juntan hacia el centro, indicando mayor pendiente.
https://mse.redwoods.edu/darnold/math50c/python/contours/index.xhtml
Si se deseara forzar el número de contornos basta con indicar el número de curvas de nivel que se desea representar:
## <Axes: >

Acorde a su nombre, las visualizaciones del paquete seaborn, por defecto, cuentan con una paleta de tonos azules.
Es interesante ver las gráficas 2D y 3D simultáneamente:
## <seaborn.axisgrid.JointGrid object at 0x0000012D86A30760>

Se puede utilizar un relleno de las curvas de nivel:
## <seaborn.axisgrid.JointGrid object at 0x0000012D87800160>

Si pensáramos que se trata de un mapa, acorde a la cultura en que nos movemos, esos colores implicarían profundidad marina, a más oscuro, más profundo.
Si se quisiera representar tierra, se debe cambiar el color:
Habría que restringir el rango de colores para no representar terreno como agua. La paleta de colores terrain es un LinearSegmentedColormap, objeto que se define por interpolación. Almacena algunos puntos de muestreo en un diccionario y puede interpolar entre ellos, dependiendo del número de colores necesarios.
from matplotlib import cm
cmap = cm.terrain(np.linspace(0,1,30))
cmap = cm.colors.ListedColormap(cmap[7:,:-1])
sns.kdeplot(x=x, y=y, fill = True, cmap=cmap, levels = 15)## <Axes: >

Entendida conceptualmente la representación de curvas de nivel de mapas, se entra en materia acerca de los campos.