Generar líneas y áreas arbitrarias en Matplotlib

Publicado el 09 agosto 2022 por Daniel Rodríguez @analyticslane

Al crear una gráfica con Matplotlib puede surgir la necesidad de dibujar líneas o áreas arbitrarias para realizar anotaciones. Aunque no es una herramienta de dibujo, esta no es una tarea complicada. Veamos en este tutorial los pasos para poder incluir líneas y áreas arbitrarias en Matplotlib.

Creación de una línea

Una opción para dibujar líneas en las figuras de Matplotlib es plot(). Para ello, solamente habrá que pasarle como parámetros las coordenadas iniciales y finales de la recta que se desea dibujar, uniendo ambas mediante una línea sólida. Siendo el primer parámetro una lista con las posiciones en el eje x y el segundo otra lista con las posiciones en eje y. Esto es, la forma básica cómo se deben llamar a esta función es la siguiente

plot([x1, x2], [y1, y2]).

Así, si se desea dibujar una recta entre el punto (1, 5) y (2, 6) solamente se debería escribir un código como el siguiente.

import matplotlib.pyplot as plt 

plt.plot([1, 2], [5, 6], color='green')
plt.show()

Lo que produce como resultado la siguiente figura, donde se puede apreciar una línea verde entre los puntos indicados.

Combinación de varias líneas

En el caso de que se desee dibujar más de una línea solamente se debe llamar a la función plot() tantas veces como sea necesario. Así, al igual que el resto de objetos, estos se dibujarán cuando se llame a la función show(). Por ejemplo, si se desea crear un triángulo que una las coordenadas (1, 5), (2, 6) y (3, 3) solamente se debe ejecutar el siguiente pedazo de código.

plt.plot([1, 2], [5, 6], color='green')
plt.plot([2, 3], [6, 3], color='blue')
plt.plot([3, 1], [3, 5], color='red')
plt.show()

Con lo que se obtiene la siguiente figura.

Nótese que en este caso se ha usado un color diferente para cada una de las líneas, pero sí solamente se desea una un color esta figura se puede crear en una única llamada a la función plot().

plt.plot([1, 2, 3, 1], [5, 6, 3, 5], color='red')
plt.show()

Obteniendo ahora como resultado la siguiente gráfica.

Creación de un área entre las líneas

Finalmente, si se desea rellenar el área dentro de la figura se puede recurrir a la función fill_between(), la cual tiene la siguiente forma básica

fill_between(x, y1, y2=0, ...)

Los únicos parámetros de la función obligatorios son los dos primeros. Mediante el primer parámetro, x, se deben indicar las coordenadas del eje x, mientras que con el segundo se indican las coordenadas de la curva en el eje y. El tercer parámetro, y2, es opcional, permite indicar las coordenadas de una segunda curva con la que se cierra el área. En el caso de que se omita el área se cerrará en el eje de abscisas.

Por ejemplo, para dibujar el triángulo de la gráfica anterior se deben tomar los puntos de eje x donde comienzan y finalizan las líneas, esto es (1, 2, 3). Ahora y1 serían los valores de que toma la curva en estos puntos es (5, 6, 3). Con lo que se puede ejecutar el siguiente código

plt.plot([1, 2, 3, 1], [5, 6, 3, 5], color='red')
plt.fill_between([1, 2, 3], [5, 6, 3], color='gray')
plt.show()

Para obtener la siguiente figura

Al no haber indicado los valores de y2 el área llega hasta el eje x, pero esto no es lo que se desea para esta figura. Hay que conocer los valores de la segunda curva para las posiciones (1, 2, 3). Los más fáciles son el primero y el último, siendo los mismos que en la curva superior, 5 y 3 respectivamente. El punto medio será el punto intermedio entre 5 y 3, esto es, 4. Así el con el siguiente código se crea un área dentro del triángulo.

plt.plot([1, 2, 3, 1], [5, 6, 3, 5], color='red')
plt.fill_between([1, 2, 3], [5, 6, 3], [5, 4, 3], color='gray')
plt.show()

Lo que produce la siguiente figura

Creación de áreas más complejas

Las áreas que se dibujar con la función fill_between() no tienen por qué ser solamente rectas, las áreas pueden ser tan complejas como las que se crean con la función plot(). Así, se puede dibujar un área en base a un seno con el siguiente empleo

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, np.pi, 100)
y = np.sin(np.pi * x / 2)

plt.plot(x, y, color='red')
plt.fill_between(x, y, color='gray')
plt.show()

Obteniendo como resultado la siguiente figura.

Conclusiones

En esta ocasión se ha visto cómo dibujar líneas y áreas arbitrarias en Matplotlib. Unos métodos que pueden ser de gran utilidad para incluir anotaciones en las gráficas.