Skip to content

Cómo manejar fácilmente fill_between en Matplotlib

Updated on

La visualización de datos es tanto un arte como una ciencia. Una de las herramientas más poderosas en el arsenal de un científico de datos es Matplotlib, una versátil biblioteca de Python que proporciona una sólida base para crear una amplia variedad de gráficos, diagramas y visualizaciones de datos más complejas. Entre su amplia gama de características, una se destaca por su capacidad única para resaltar áreas de importancia dentro de un gráfico: la función fill_between.

La función fill_between se puede utilizar para rellenar el área entre dos líneas, pero sus capacidades van más allá de simples rellenos. Con un poco de ingenio, se puede utilizar para crear rellenos condicionales que pueden resaltar períodos o patrones específicos en tus datos. Este artículo tiene como objetivo ofrecer una explicación rica y detallada sobre cómo aprovechar el poder de fill_between, mejorando tus gráficos de Matplotlib y destacando sobre los mejores recursos disponibles.

Por qué fill_between es importante en Matplotlib

La capacidad de llenar áreas entre líneas en un gráfico proporciona un énfasis visual que puede acentuar diferencias, tendencias o patrones dentro de tus datos. Puede ser fundamental para señalar áreas clave, guiar la atención del espectador hacia puntos de datos significativos o simplemente agregar un toque estético a tus gráficos. Cuando se combina con declaraciones condicionales, puede adquirir un nuevo nivel de utilidad, permitiendo resaltados más matizados y específicos en tus datos.

Relleno entre líneas: lo básico

Antes de sumergirnos en el relleno condicional, vamos a entender cómo funciona fill_between a un nivel básico. La función toma al menos tres argumentos:

  1. Los valores x: estos establecen los límites horizontales del relleno.
  2. Los primeros valores y: estos establecen el límite vertical inferior.
  3. Los segundos valores y: estos establecen el límite vertical superior.

Aquí tienes un ejemplo sencillo:

import matplotlib.pyplot as plt
import numpy as np
 
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
 
plt.plot(x, y1, '-b', label='sine')
plt.plot(x, y2, '-r', label='cosine')
plt.fill_between(x, y1, y2, color='gray', alpha=0.5)
plt.show()

En este ejemplo, el área entre las funciones del seno y el coseno se rellena con un color gris.

Introducción a los rellenos condicionales con where

La función fill_between también puede aceptar un argumento where. Este argumento te permite especificar una condición booleana en la cual se aplicará el relleno. En otras palabras, el relleno solo ocurrirá donde esta condición sea True.

Ahora, vamos a utilizar un ejemplo sencillo de un DataFrame para ilustrar esto. Supongamos que tenemos un DataFrame df con las columnas A y B, y queremos rellenar entre estas dos líneas:

plt.fill_between(df.index, df['A'], df['B'], where=(df['A'] > df['B']), color='gray', alpha=0.5)

Esto rellena el área entre A y B solo donde A es mayor que B.

El problema: relleno condicional entre valores de índice específicos

Cuando intentas usar fill_between con una condición que involucra valores de índice específicos, es posible que te encuentres con un error común. Esto se ilustra bien con una pregunta publicada por un usuario que quería rellenar el área entre dos líneas, pero solo para los meses específicos: 'enero', 'febrero' y 'marzo'. Sus intentos iniciales dieron como resultado un ValueError o ningún relleno en absoluto.

Vamos a ahondar en este problema, entender la causa raíz y proporcionar una solución infalible, justo después del descanso.

Entendiendo la causa raíz del error

Continuando desde donde lo dejamos, el usuario intentó rellenar entre dos líneas de un DataFrame, con una condición en los valores de índice. Específicamente, querían aplicar el relleno solo a los meses de 'enero', 'febrero' y 'marzo'. Sin embargo, se encontraron con un problema.

El ValueError que recibieron al intentar usar la palabra clave in con un array y una lista se debe a que la palabra clave in de Python verifica si un elemento está en un iterable. Pero en este caso, se estaba utilizando para verificar si un array, que no es un iterable, está en una lista. Esta operación es ambigua y, por lo tanto, genera un error.

La razón por la cual su segundo intento (donde convirtieron el índice en una lista y usaron la palabra clave in) no produjo ningún relleno es porque la operación in aún no estaba vectorizada, es decir, no se aplicaba elemento a elemento.

La solución: vectorizar la condición con isin()

Un concepto clave en pandas, la vectorización implica realizar operaciones en matrices enteras en lugar de elementos individuales. Para rellenar líneas de forma condicional basándote en valores de índice específicos, debes vectorizar la condición utilizando el método incorporado de pandas .isin(). Este método verifica cada elemento del índice del DataFrame contra una lista y devuelve una Serie booleana.

Por lo tanto, la solución correcta para el problema del usuario sería:

ax.fill_between(x = plotMonths.index,
                y1 = plotMonths['ro laws'],
                y2 = plotMonths['ro ordos'],
                where = plotMonths.index.isin(['January', "February", 'March']),
                facecolor = 'lightskyblue',
                alpha = 0.2)

Aquí, where = plotMonths.index.isin(['January', "February", 'March']) verifica cada elemento de plotMonths.index contra la lista ['January', "February", 'March'] y devuelve una Serie booleana. Esta Serie se utiliza para rellenar condicionalmente entre las líneas 'ro laws' y 'ro ordos'.

Alternativa a Matplotlib: Visualiza datos con PyGWalker

Además de utilizar Matplotlib para visualizar tu dataframe de pandas, aquí tienes una alternativa, una biblioteca de Python de código abierto que puede ayudarte a crear visualizaciones de datos fácilmente: PyGWalker (opens in a new tab). No es necesario realizar un procesamiento complicado con Python, simplemente importa tus datos y arrastra y suelta variables para crear todo tipo de visualizaciones de datos. Aquí tienes un video de demostración rápida sobre el funcionamiento:


Así es cómo puedes usar PyGWalker en tu Jupyter Notebook:

pip install pygwalker
import pygwalker as pyg
gwalker = pyg.walk(df)

Alternativamente, puedes probarlo en Kaggle Notebook/Google Colab:

Ejecutar PyGWalker en Kaggle Notebook (opens in a new tab)Ejecutar PyGWalker en Google Colab (opens in a new tab)Dale una ⭐️ a PyGWalker en GitHub (opens in a new tab)
Ejecutar PyGWalker en Kaggle Notebook (opens in a new tab)Ejecutar PyGWalker en Google Colab (opens in a new tab)Ejecutar PyGWalker en Google Colab (opens in a new tab)

PyGWalker se basa en el apoyo de nuestra comunidad de código abierto. ¡No olvides visitar PyGWalker GitHub (opens in a new tab) y darnos una estrella!

Conclusión

La función fill_between en Matplotlib ofrece características poderosas para agregar énfasis visual a tus gráficos. Permite rellenar entre líneas y, con el uso del argumento where, puede realizar rellenos condicionales. Comprender estas características y sus principios subyacentes es esencial para una visualización efectiva de datos.

Preguntas frecuentes

A lo largo de este artículo, nos hemos adentrado en la función fill_between, sus usos y su implementación. Aquí tienes algunas preguntas frecuentes para resumir y reforzar los puntos clave:

P1: ¿Qué es la función fill_between en Matplotlib?

La función fill_between se utiliza para rellenar el área entre dos líneas en un gráfico. Es una herramienta potente para resaltar diferencias, tendencias o patrones en los datos.

P2: ¿Cómo puedo rellenar entre líneas condicionalmente en Matplotlib?

Puedes utilizar el argumento where en la función fill_between para rellenar entre líneas basado en una condición. Esta condición debe ser una Serie booleana con el mismo índice que tus valores de x.

P3: ¿Por qué obtengo un ValueError al utilizar fill_between con una condición en valores de índice específicos?

Este error ocurre cuando se utiliza la palabra clave in de Python para verificar si un array está en una lista. Para solucionarlo, puedes utilizar el método isin() de pandas, que verifica cada elemento del índice del DataFrame con una lista y devuelve una Serie booleana.