Seaborn¶
Acerca de Seaborn¶
Seaborn
se presenta como una respuesta a las limitaciones que pueda tener Matplotlib
. Es una biblioteca que proporciona una capa sobre Matplotlib, ofreciendo mejoras significativas en varios aspectos:
- Estilo de trazado y valores predeterminados mejorados: Seaborn define opciones sensatas y estéticamente agradables para el estilo de trazado y los valores de color predeterminados, facilitando la creación de gráficos atractivos de manera predeterminada.
- Funciones de alto nivel: Seaborn incluye funciones simples de alto nivel para tipos de trazado estadísticos comunes, lo que reduce la cantidad de código necesario para generar visualizaciones complejas.
- Integración con Pandas: Seaborn está diseñado para trabajar directamente con DataFrames de Pandas. Permite utilizar las etiquetas de los DataFrames de manera inteligente en los gráficos, simplificando enormemente el proceso de visualización de datos.
Visualización Declarativa¶
La visualización declarativa se enfoca en describir los datos y sus relaciones, dejando los detalles de implementación al sistema. Este paradigma permite a los usuarios concentrarse en qué desean visualizar en lugar de preocuparse por cómo hacerlo. Algunas de sus características principales son:
- Enfoque en el "Qué": El usuario especifica qué quiere visualizar en lugar de cómo debe realizarse la visualización.
- Automatización de detalles: Los detalles de la implementación, como el trazado y el diseño, se determinan automáticamente.
- Separación de especificación y ejecución: La especificación de la visualización está separada de su ejecución, permitiendo una definición clara y concisa de las visualizaciones.
En resumen, construir visualizaciones declarativas implica trabajar con los siguientes elementos:
- Data (Datos): Los datos que se desean visualizar.
- Transformation (Transformaciones): Operaciones aplicadas a los datos para preparar la visualización.
- Marks (Marcas): Los elementos gráficos básicos utilizados para representar los datos (por ejemplo, puntos, líneas, áreas).
- Encoding (Codificación): La asignación de datos a propiedades visuales como posición, tamaño, color, etc.
- Scale (Escalas): Mapeo de los valores de los datos a rangos visuales.
- Guides (Guías): Elementos de apoyo como ejes, leyendas y etiquetas que ayudan a interpretar la visualización.
Este enfoque permite crear visualizaciones de manera más eficiente y efectiva, facilitando la exploración y presentación de datos complejos.
Diferencias entre enfoques
Imperativa | Declarativa |
---|---|
Especificar cómo se debe hacer algo | Especificar qué se quiere hacer |
Especificación y ejecución entrelazadas | Separar especificación de ejecución |
Colocar un círculo rojo aquí y un círculo azul acá | Mapear x como posición e y como el color |
Ejemplo
El Iris dataset es un conjunto de datos que contine una muestras de tres especies de Iris (Iris setosa, Iris virginica e Iris versicolor). Se midió cuatro rasgos de cada muestra: el largo y ancho del sépalo y pétalo, en centímetros.
Este ejemplo servirá para mostrar una de las mayores diferencias entre una visualización imperativa (como matplotlib
) versus una declarativa (como seaborn
).
# librerias
import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
pd.set_option('display.max_columns', 500) # Ver más columnas de los dataframes
# Ver gráficos de matplotlib en jupyter notebook/lab
%matplotlib inline
# cargar datos
iris_df = pd.read_csv(
"https://raw.githubusercontent.com/fralfaro/MAT281_2022/main/docs/lectures/data_manipulation/visualization/data/iris.csv"
)
iris_df.columns = ['sepalLength',
'sepalWidth',
'petalLength',
'petalWidth',
'species']
iris_df.head()
sepalLength | sepalWidth | petalLength | petalWidth | species | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |
1 | 4.9 | 3.0 | 1.4 | 0.2 | setosa |
2 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |
3 | 4.6 | 3.1 | 1.5 | 0.2 | setosa |
4 | 5.0 | 3.6 | 1.4 | 0.2 | setosa |
El ejemplo clásico consiste en graficar sepalWidth versus petalLength y colorear por especie.
Imperativo
En matplotlib
sería algo así:
color_map = dict(zip(iris_df["species"].unique(),
["blue", "green", "red"]))
plt.figure(figsize=(10, 6))
for species, group in iris_df.groupby("species"):
plt.scatter(group["petalLength"],
group["sepalWidth"],
color=color_map[species],
alpha=0.3,
edgecolor=None,
label=species,
)
plt.legend(frameon=True, title="species")
plt.xlabel("petalLength")
plt.ylabel("sepalWidth")
plt.show()
Declarativo
En seaborn
sería algo así:
sns.set(rc={'figure.figsize':(10,8)})
sns.scatterplot(
x='petalLength',
y='sepalWidth',
data=iris_df,
hue='species',
palette = ['blue', 'green', 'red']
)
plt.show()