Visualización Declarativa

Es un paradigma de visualización en donde se busca preocuparse de los datos y sus relaciones, más que en detalles sin mayor importancia. Algunas características son:

  • Se especifica lo que se desea hacer.

  • Los detalles se determinan automáticamente.

  • Especificación y Ejecución están separadas.

A modo de resumen, se refiere a construir visualizaciones a partir de los siguientes elementos:

  • Data

  • Transformation

  • Marks

  • Encoding

  • Scale

  • Guides

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).

image info

# 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(os.path.join("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()
../../../../../_images/declarativa_9_0.png

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()
../../../../../_images/declarativa_11_0.png