Agregar líneas a las figuras de Matplotlib

Publicado el 01 septiembre 2022 por Daniel Rodríguez @analyticslane

Incluir una o varias líneas en una gráfica puede ser una herramienta sencilla, pero muy útil, para señalar al lector algunos valores que pueden ser de interés. Tales como los cambios de tendencia de una serie. Por eso en la mayoría de las librerías gráficas existen funciones para ello. Veamos algunas de las funciones disponibles para agregar líneas a las figuras de Matplotlib.

Incluir líneas verticales en Matplotlib

Para representar una serie de datos en Matplotlib se puede emplear la función plot(), pasándole cómo parámetros los valores tanto de x como de y. Por ejemplo, tal como se hace en el siguiente código.

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5, 6, 7]
y = [4, 3, 2, 5, 3, 6, 5]

plt.plot(x, y, label="Valores")
plt.xlabel("Tiempo")
plt.ylabel("Valores")
plt.legend()
plt.show()

El cual produce como resultado la siguiente figura.

Gráfico con una serie básica

Ahora, en el caso de que se le desee indicar al usuario un rango de valores para que se fije en él se puede recurrir a unas líneas verticales. Lo que en Matplotlib se puede conseguir con la función axvline(). El único parámetro que necesita esta función es la pasión en la que se desee dibujar ( x). Aunque también es posible indicar otras opciones cómo puede ser el color ( color) o una etiqueta para la línea ( label).

Siguiendo con el ejemplo anterior se le puede iniciar al usuario que se fije en los valores del rango que va de 3 a 6 mediante un par de líneas. Facilitando al lector que identifique de una forma rápida estos valores. Así se puede crear una línea verde para indicar el inicio de los valores, la cual también se puede etiquetar con la palabra "Min", y otra línea roja para señalar el final de la serie, a la que se puede agregar la etiqueta "Max". Esto es exactamente lo que se hace en el siguiente código mediante el uso de la función axvline().

plt.plot(x, y, label="Valores")
plt.axvline(x=3, color="g", label="Min")
plt.axvline(x=6, color="r", label="Max")
plt.xlabel("Tiempo")
plt.ylabel("Valores")
plt.legend()
plt.show()

Produciendo la siguiente figura cuando se ejecuta.

Serie creada en Matplotlib a la que se le han agregado dos líneas verticales

Incluir líneas solamente hasta una altura

En una figura puede que no se quiera incluir una línea que ocupe toda la gráfica. Para solucionar esto la función axvline() cuenta con dos parámetros opcionales ymin e ymax, indicando mediante el primero el valor donde comienza la línea y el segundo el valor donde termina. Aunque calcular la posición correcta puede ser un poco complicado, ya que se debe indicar la fracción de la figura dónde debe comenzar y terminar la línea, no los valores del eje y. Lo que se puede ver en el siguiente ejemplo donde se dibuja la línea hasta el valor de los datos.

plt.plot(x, y, label="Valores")
plt.axis([1, 7, 1, 7])
plt.axvline(x=3, ymax=1/6, color="g", label = "Min")
plt.axvline(x=6, ymax=5/6, color="r", label = "Max")
plt.xlabel("Tiempo")
plt.ylabel("Valores")
plt.legend()
plt.show()

Con lo que se obtiene la siguiente figura.

Serie creada en Matplotlib a la que se le han agregado dos líneas verticales limitadas en altura

Nótese que para indicar 2 en la primera línea se ha usado 1/5, mientras que para el valor 6 se ha empleado 5/6. El proceso para obtener estos valores es sencillo. Lo primero en lo que debemos fijarnos es que el eje y se ha fijado entre 1 y 7, por lo que la altura total son 6. Por otro lado como comienza en 1, el primer punto sería la altura de este menos el origen, esto es (2 - 1)/(7 - 1) = 1/6. Mientras que el segundo caso sería el cálculo siguiente (6 - 1)/(7 - 1) = 5/6.

Incluir líneas horizontales en Matplotlib

Para dibujar líneas horizontales existe una función análoga a la anterior que se llama axhline(). Siendo necesario en este caso indicar la altura del eje y en el que se desea dibujar la línea. El resto de los parámetros funciona igual salvo que para indicar la posición de inicio y fin de la línea los parámetros son xmin y xmax, algo obvio ya que ahora se acota en el eje x. Por ejemplo, se puede pintar una línea verde para identificar el punto mínimo y otra roja para el máximo como se muestra en el siguiente ejemplo.

plt.plot(x, y, label="Valores")
plt.axis([1, 7, 1, 7])
plt.axvline(x=3, ymax=1/6, color="g", label="Min")
plt.axvline(x=6, ymax=5/6, color="r", label="Max")
plt.axhline(y=2, xmax=2/6, color="g")
plt.axhline(y=6, xmin=5/6, color="r")
plt.xlabel("Tiempo")
plt.ylabel("Valores")
plt.legend()
plt.show()

Código que produce la siguiente figura.

Serie creada en Matplotlib a la que se le han agregado dos líneas verticales y horizontales

Conclusiones

En esta ocasión se ha visto una forma para agregar líneas a las figuras de Matplotlib mediante el uso de las funciones axhline() y axvline(). Las cuales son bastante fáciles de usar y pueden ser de ayuda para facilitar al lector identificar la posición de valores o rangos de valores concretos a los que debería prestar atención.