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()
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()
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()
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()
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()
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()
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()
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
.
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%.
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.
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.
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
.
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.
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()
También te puede interesar