Tutorial

Principales diferencias entre matplotlib, seaborn y plotly

Compara las principales librerías de visualización de Python: Matplotlib, Seaborn y Plotly. Aprende cuándo usar cada librería, sus fortalezas, limitaciones y mejores prácticas para diferentes necesidades de visualización.

¿Qué librerías de Python puedes usar para visualización de datos? ¿En qué casos usas cada una de ellas?

  1. Matplotlib para gráficos altamente personalizables.
  2. Seaborn para gráficos automatizados basados en Matplotlib.
  3. Plotly para gráficos interactivos.

¿Cómo importas estas librerías en el entorno de Python?

Debes importar una sub-librería que contenga las principales funciones de graficado para algunas de ellas.

import matplotlib.pyplot as plt
import seaborn as sns
import plotly.express as px

¡Suficiente teoría! Veamos algunos ejemplos usando el mismo gráfico para cada librería.

Datos

Usando el famoso conjunto de datos gapminder, graficaremos datos de países en 2007.

import pandas as pd
df = pd.read_excel('gapminder.xlsx')
Gráfico básico de datos crudos del conjunto de datos gapminder usando librerías de visualización de Python
F1. Gráfico básico de datos crudos del conjunto de datos gapminder

Gráfico de dispersión

Matplotlib

Matplotlib crea un gráfico de dispersión simple sin etiquetas en los ejes.

plt.scatter(x='gdpPercap', y='lifeExp', data=df)
Gráfico de dispersión simple creado con Matplotlib mostrando PIB per cápita vs esperanza de vida
F2. Gráfico de dispersión de Matplotlib del PIB per cápita versus esperanza de vida

Seaborn

Por otro lado, seaborn crea un gráfico de dispersión con etiquetas en los ejes. E incluso añade algunos bordes a los puntos.

sns.scatterplot(x='gdpPercap', y='lifeExp', data=df)
Gráfico de dispersión con etiquetas de ejes y puntos estilizados, creado usando Seaborn
F3. Gráfico de dispersión de Seaborn con ejes etiquetados y puntos estilizados

Ahora, ¿qué pasa si quisieras colorear los puntos por continente?

Con matplotlib, obtienes un error fatal porque espera una columna con nombres de colores, no una columna con nombres de continentes.

plt.scatter(x='gdpPercap', y='lifeExp', data=df, c='continent')

# ValueError: Invalid RGBA argument: 'Asia'

Por otro lado, seaborn automatiza la creación de un gráfico de dispersión con una leyenda codificada por colores para la columna continent, usando el parámetro hue.

sns.scatterplot(x='gdpPercap', y='lifeExp', data=df, hue='continent')
Gráfico de dispersión codificado por colores por continente usando el parámetro hue de Seaborn
F4. Gráfico de dispersión de Seaborn codificado por colores por continente

Ahora, ¿cómo puedes identificar el país representado por cada punto?

Este proceso no es automático al usar matplotlib, ni tampoco al usar seaborn.

Necesitarías crear un horrible bucle for para añadir los nombres de países a los puntos, terminando con un gráfico desordenado.

sns.scatterplot(x='gdpPercap', y='lifeExp', data=df, hue='continent')

for idx, data in df.iterrows():
    plt.text(x=data['gdpPercap'], y=data['lifeExp'], s=data['country'])
    
Gráfico de dispersión de Seaborn con nombres de países superpuestos creando una apariencia desordenada
F5. Gráfico de dispersión desordenado con nombres de países usando Seaborn y Matplotlib

Sí, puedes combinar seaborn con matplotlib para añadir nuevos elementos al gráfico porque seaborn está construido sobre matplotlib.

También, puedes añadir nuevos elementos al gráfico usando funciones de matplotlib en una nueva línea de código—por ejemplo, un título, etiquetas o una leyenda.

sns.scatterplot(x='gdpPercap', y='lifeExp', data=df, hue='continent')

for idx, data in df.iterrows():
    plt.text(x=data['gdpPercap'], y=data['lifeExp'], s=data['country'])

plt.title('Gráfico desordenado')
Gráfico de dispersión altamente desordenado con nombres de países y un título, mostrando las desventajas del etiquetado excesivo
F6. Gráfico altamente desordenado con nombres de países y título añadido

¿Cómo podemos ordenar el desorden de nombres de países?

Plotly

En lugar de añadir los nombres de países al gráfico, puedes pasar el cursor sobre los puntos para ver los nombres de países.

px.scatter(df, x='gdpPercap', y='lifeExp', color='continent', hover_name='country')
Gráfico de dispersión interactivo de Plotly con puntos sobre los que se puede pasar el cursor mostrando nombres de países
F7. Gráfico de dispersión interactivo de Plotly con puntos de datos sobre los que se puede pasar el cursor

Me encanta plotly porque es interactivo, y puedes hacer zoom in, zoom out, hacer clic en la leyenda para ocultar algunos países, e incluso guardar el gráfico como una imagen.

Pero no me malinterpretes, plotly no es perfecto.

Si quisiera un gráfico altamente personalizado, usaría matplotlib porque es más flexible, y puedes controlar cada detalle del gráfico.

Estas tres librerías contienen las funciones necesarias para crear cualquier otro tipo de gráfico. Solo elige la que mejor se adapte a tus necesidades.

Para aprender más sobre estas librerías, visita la documentación oficial:

Visita su galería de ejemplos para ver qué puedes hacer con ellas y replica los gráficos en tus proyectos con tus datos.

Conclusiones

  1. Si eres principiante, usa plotly para gráficos simples.
  2. Si eres un usuario intermedio, usa seaborn con matplotlib para gráficos más complejos.
  3. Si eres un usuario avanzado, usa matplotlib para gráficos altamente personalizables.