Contour (curvas de nivel) en matplotlib

Curvas de nivel con la función contour

La librería matplotlib proporciona la función contour para crear curvas de nivel, también llamadas gráficas de contorno. La función requiere un array de dimensión (M, N) que represente las alturas del contour (Z) y las coordenadas para esos valores (X e Y).

import numpy as np
import matplotlib.pyplot as plt

# Datos
X, Y = np.meshgrid(np.linspace(-5, 10, 100),
                   np.linspace(-5, 10, 100))
Z = np.sqrt(X ** 2 + Y ** 2)

# Contour
fig, ax = plt.subplots()
ax.contour(X, Y, Z)

# plt.show()

Contour en matplotlib

Los argumentos X e Y son opcionales, pero si no los especificas el rango de los ejes del gráfico irá desde cero hasta el tamaño de Z.

import numpy as np
import matplotlib.pyplot as plt

# Datos
X, Y = np.meshgrid(np.linspace(-5, 10, 100),
                   np.linspace(-5, 10, 100))
Z = np.sqrt(X ** 2 + Y ** 2)

# Contour
fig, ax = plt.subplots()
ax.contour(Z)

# plt.show()

La función contour de matplotlib para crear curvas de nivel en Python

Número de niveles

El número por defecto de niveles se calcula automáticamente en base a tus datos, pero puedes utilizar el argumento levels para pasar un entero y establecer el número de niveles o pasar un array de enteros en orden ascendente para especificar los niveles en los que quieres que se dibujen los contornos.

import numpy as np
import matplotlib.pyplot as plt

# Datos
X, Y = np.meshgrid(np.linspace(-5, 10, 100),
                   np.linspace(-5, 10, 100))
Z = np.sqrt(X ** 2 + Y ** 2)

# Contour
fig, ax = plt.subplots()
ax.contour(X, Y, Z, levels = 50)

# plt.show()

Cambiar el número de niveles de un contour hecho con Python y matplotlib

Color de las curvas de nivel

La función contour utiliza la paleta de colores viridis si no se especifica ninguna, pero el argumento cmap permite sobrescribirla con una nueva paleta de colores.

import numpy as np
import matplotlib.pyplot as plt

# Datos
X, Y = np.meshgrid(np.linspace(-5, 10, 100),
                   np.linspace(-5, 10, 100))
Z = np.sqrt(X ** 2 + Y ** 2)

# Contour
fig, ax = plt.subplots()
ax.contour(X, Y, Z, cmap = "Reds")

# plt.show()

Cambiar la paleta de colores de las curvas de nivel en Python

Ten en cuenta que otra opción es hacer uso del argumento colors para especificar un único color o un array de colores para las curvas de nivel. En el segundo caso, el array de colores se recicla en orden ascendente y los colores se repiten si el número de colores es menor al número de niveles.

import numpy as np
import matplotlib.pyplot as plt

# Datos
X, Y = np.meshgrid(np.linspace(-5, 10, 100),
                   np.linspace(-5, 10, 100))
Z = np.sqrt(X ** 2 + Y ** 2)

# Contour
fig, ax = plt.subplots()
ax.contour(X, Y, Z, colors = ["g", "k", "r"])

# plt.show()

Cambiar los colores de las curvas de nivel de un gráfico en Python

Estilo y grosor de las curvas de nivel

Los argumentos linestyles y linewidths permiten personalizar el estilo y grosor de las curvas de nivel. Los posibles estilos de línea son None, "solid", "dashed", "dashdot" y "dotted". Recuerda que ambos argumentos permiten arrays como input y en caso de utilizarlos funcionarán igual que los colores, como en el ejemplo anterior.

import numpy as np
import matplotlib.pyplot as plt

# Datos
X, Y = np.meshgrid(np.linspace(-5, 10, 100),
                   np.linspace(-5, 10, 100))
Z = np.sqrt(X ** 2 + Y ** 2)

# Contour
fig, ax = plt.subplots()
ax.contour(X, Y, Z, linestyles = "dashed", linewidths = 1)

# plt.show()

Tipo y grosor de línea de un gráfico de contorno en Python

Contour con etiquetas

Es posible agregar etiquetas a cada curva de nivel utilizando la función clabel tal y como se muestra en el siguiente ejemplo.

import numpy as np
import matplotlib.pyplot as plt

# Datos
X, Y = np.meshgrid(np.linspace(-5, 10, 100),
                   np.linspace(-5, 10, 100))
Z = np.sqrt(X ** 2 + Y ** 2)

# Contour
fig, ax = plt.subplots()
cnt = ax.contour(X, Y, Z)
ax.clabel(cnt, cnt.levels, inline = True, fontsize = 10)

# plt.show()

Contour con etiquetas en matplotlib

La función contourf

La función contourf es igual que contour, pero en lugar de dibujar curvas de nivel colorea las áreas entre las curvas. El siguiente ejemplo es el mismo que el primero de este tutorial pero utilizando la función contourf.

La función contourf en matplotlib

import numpy as np
import matplotlib.pyplot as plt

# Datos
X, Y = np.meshgrid(np.linspace(-5, 10, 100),
                   np.linspace(-5, 10, 100))
Z = np.sqrt(X ** 2 + Y ** 2)

# Contour relleno
fig, ax = plt.subplots()
ax.contourf(X, Y, Z)

# plt.show()

Transparencia

El argumento alpha controla la transparencia de un contour. En el siguiente ejemplo establecemos una transparencia del 50%.

Cmabiar la transparencia de un contour en Python con alpha

import numpy as np
import matplotlib.pyplot as plt

# Datos
X, Y = np.meshgrid(np.linspace(-5, 10, 100),
                   np.linspace(-5, 10, 100))
Z = np.sqrt(X ** 2 + Y ** 2)

# Contour relleno
fig, ax = plt.subplots()
ax.contourf(X, Y, Z, alpha = 0.5)

# plt.show()

Contour con líneas y relleno

Cabe destacar que puedes utilizar ambas funciones (contour y contourf) para crear un contour relleno con curvas de nivel.

Contour relleno con curvas de nivel en Python

import numpy as np
import matplotlib.pyplot as plt

# Datos
X, Y = np.meshgrid(np.linspace(-5, 10, 100),
                   np.linspace(-5, 10, 100))
Z = np.sqrt(X ** 2 + Y ** 2)

# Contour relleno con líneas
fig, ax = plt.subplots()
ax.contour(X, Y, Z, colors = "k")
ax.contourf(X, Y, Z, alpha = 0.75)

# plt.show()

Contour relleno con líneas y etiquetas

Además, también puedes agregar etiquetas a las curvas con la función clabel, como en el ejemplo de la sección anterior.

Contour relleno con curvas de nivel y etiquetas en matplotlib

import numpy as np
import matplotlib.pyplot as plt

# Datos
X, Y = np.meshgrid(np.linspace(-5, 10, 100),
                   np.linspace(-5, 10, 100))
Z = np.sqrt(X ** 2 + Y ** 2)

# Contour relleno con etiquetas
fig, ax = plt.subplots()
cnt = ax.contour(X, Y, Z, colors = "k", linewidths = 0.5)
ax.clabel(cnt, cnt.levels, inline = True, fontsize = 10)
ax.contourf(X, Y, Z)

# plt.show()

Color de fondo

El color para cada nivel se puede personalizar de la misma manera que con la función contour. Tendrás que pasar un color o un array de colores al argumento colors o cambiar la paleta de colores con cmap.

Cambiar los colores de fondo de un contour en Python

import numpy as np
import matplotlib.pyplot as plt

# Datos
X, Y = np.meshgrid(np.linspace(-5, 10, 100),
                   np.linspace(-5, 10, 100))
Z = np.sqrt(X ** 2 + Y ** 2)

# Contour relleno
fig, ax = plt.subplots()
ax.contourf(X, Y, Z, cmap = "plasma")

# plt.show()

Contour con leyenda

Por último, si quieres agregar una barra de color como leyenda del contour puedes utilizar la función colorbar tal y como se muestra a continuación. Esto hará que sea más fácil leer los niveles del contour.

Contour con leyenda en Python

import numpy as np
import matplotlib.pyplot as plt

# Datos
X, Y = np.meshgrid(np.linspace(-5, 10, 100),
                   np.linspace(-5, 10, 100))
Z = np.sqrt(X ** 2 + Y ** 2)

# Contour relleno
fig, ax = plt.subplots()
cnt = ax.contourf(X, Y, Z)

# Color bar
cbar = ax.figure.colorbar(cnt, ax = ax)
cbar.ax.set_ylabel("Título de la leyenda", rotation = -90, va = "bottom")

# plt.show()
Storytelling con Datos

Visualización de datos para profesionales

Comprar en Amazon
Better Data Visualizations

A Guide for Scholars, Researchers, and Wonks

Comprar en Amazon

También te puede interesar