tutoriales.com

Desvelando Conexiones Ocultas: Guía Práctica de Gráficos de Acordes en Python

Descubre cómo utilizar gráficos de acordes para representar conexiones y proporciones entre diferentes entidades en Python. Este tutorial te guiará paso a paso para crear visualizaciones impactantes y desvelar patrones ocultos en tus datos.

Intermedio15 min de lectura10 views
Reportar error

Los gráficos de acordes son herramientas de visualización poderosas que permiten ilustrar las interrelaciones y el flujo entre diferentes entidades. Son especialmente útiles para mostrar conexiones complejas y la magnitud de estas conexiones en un conjunto de datos circular. Imagina visualizar las migraciones de especies, el tráfico web entre diferentes secciones de un sitio, o las transacciones financieras entre bancos; los gráficos de acordes lo hacen posible de una manera elegante y concisa.

En este tutorial, exploraremos cómo crear y personalizar gráficos de acordes utilizando Python. Nos centraremos en bibliotecas que facilitan esta tarea, proporcionando ejemplos prácticos y explicaciones claras para que puedas aplicar esta técnica a tus propios proyectos de visualización de datos.

📌 **Nota:** Aunque `matplotlib` y `seaborn` son excelentes para muchos tipos de gráficos, para gráficos de acordes interactivos y estéticamente ricos, a menudo recurriremos a bibliotecas más especializadas como `Plotly` o extensiones de `hvPlot` que se integran con `Bokeh` o `Plotly` para este tipo de visualizaciones.

🎯 ¿Qué son los Gráficos de Acordes y Por Qué Usarlos?

Un gráfico de acordes es una visualización que muestra las relaciones o interdependencias entre un conjunto de entidades en una disposición circular. Cada entidad se representa como un 'arco' en el perímetro del círculo, y las conexiones entre ellas se muestran como 'acordes' o 'bandas' que unen los arcos. El grosor de estos acordes y arcos suele ser proporcional a la magnitud de la relación o del valor total de la entidad.

Características clave:

  • Relaciones: Muestran cómo se conectan diferentes elementos.
  • Magnitud: El grosor de los acordes y arcos indica la fuerza o cantidad de la conexión.
  • Formato Circular: Permite una visualización compacta y estéticamente atractiva, ideal para muchos a muchos.
  • Identificación Rápida: Facilita la identificación de patrones dominantes y flujos importantes.

💡 Ventajas de los Gráficos de Acordes

CaracterísticaDescripciónAplicación Práctica
---------
Claridad de ConexionesVisualiza de forma intuitiva cómo se relacionan los nodos.Entender el flujo de datos entre sistemas.
Densidad de InformaciónCompacta gran cantidad de datos relacionales en un espacio limitado.Analizar interacciones en redes sociales o transacciones.
---------
Estética VisualSon visualmente atractivos y pueden captar la atención del público.Presentaciones de informes, dashboards interactivos.
Detección de PatronesAyuda a identificar patrones de flujo dominantes o nodos centrales.Análisis de tráfico web, cadenas de suministro.

🛠️ Preparando el Entorno: Instalación de Librerías

Para crear gráficos de acordes en Python, utilizaremos principalmente hvPlot y holoviews que, a su vez, se apoyan en Bokeh o Plotly como backends de renderizado. Si bien hay otras opciones, esta combinación ofrece una gran flexibilidad y capacidad interactiva.

Primero, asegúrate de tener pip instalado y luego ejecuta los siguientes comandos:

pip install holoviews hvplot bokeh pandas numpy

Si prefieres Plotly como backend principal (para un estilo ligeramente diferente y funcionalidades específicas), también puedes instalarlo:

pip install plotly
🔥 **Importante:** Asegúrate de reiniciar tu entorno de Jupyter/IDE después de instalar nuevas librerías para que los cambios surtan efecto.

📖 Entendiendo la Estructura de Datos

Los gráficos de acordes requieren una matriz de adyacencia o una lista de aristas (fuente, destino, valor/peso) como entrada. Una matriz de adyacencia es una tabla cuadrada donde tanto las filas como las columnas representan las mismas entidades, y el valor en la intersección (i, j) indica la fuerza de la conexión de i a j.

Por ejemplo, si tenemos 4 entidades (A, B, C, D), una matriz de adyacencia podría verse así:

ABCD
---------------
A01050
B12003
---------------
C6008
D0470

En este ejemplo:

  • De A a B hay una conexión de fuerza 10.
  • De B a A hay una conexión de fuerza 12.
  • No hay conexión directa de A a D.

Para el propósito de holoviews/hvPlot, esta matriz se puede representar como un DataFrame de Pandas, donde los índices y las columnas son los nombres de las entidades.


✨ Creando tu Primer Gráfico de Acordes con hvPlot

Vamos a empezar con un ejemplo práctico. Imaginemos que queremos visualizar el flujo de estudiantes entre diferentes departamentos de una universidad.

Paso 1: Importar Librerías y Preparar Datos

import pandas as pd
import numpy as np
import holoviews as hv
import hvplot.pandas # noqa

hv.extension('bokeh') # Puedes cambiar a 'plotly' si lo prefieres

# Definir los departamentos
departamentos = ['Ingeniería', 'Ciencias', 'Artes', 'Medicina', 'Negocios']
num_dept = len(departamentos)

# Crear una matriz de adyacencia simulada
# Esta matriz representará el número de estudiantes que se trasladan de un departamento (fila) a otro (columna)
# Aseguramos que la diagonal sea 0 (no hay traslado a sí mismo)
np.random.seed(42)
matrix = np.random.randint(0, 50, size=(num_dept, num_dept))
np.fill_diagonal(matrix, 0)

# Convertir a DataFrame de Pandas
df_matrix = pd.DataFrame(matrix, index=departamentos, columns=departamentos)

print("Matriz de Adyacencia:\n", df_matrix)
Matriz de Adyacencia:
             Ingeniería  Ciencias  Artes  Medicina  Negocios
Ingeniería           0        38      9        34        19
Ciencias            43         0     48         4        15
Artes                7        15      0        20        11
Medicina            30        27      9         0         2
Negocios             6        38     24        37         0

Paso 2: Generar el Gráfico de Acordes

Una vez que tenemos nuestros datos en formato de matriz de adyacencia (un DataFrame donde índices y columnas son las mismas categorías), generar el gráfico de acordes es sorprendentemente sencillo con hvPlot.

# Generar el gráfico de acordes
chord_diagram = df_matrix.hvplot.chord(
    width=600,
    height=600,
    title='Flujo de Estudiantes entre Departamentos'
)

# Mostrar el gráfico
chord_diagram
Ingeniería Negocios Medicina Artes Ciencias FLUJO

¡Así de fácil! hvPlot automáticamente interpreta la matriz de adyacencia y crea un gráfico de acordes interactivo. Puedes pasar el ratón por encima de los arcos y acordes para ver los detalles de los flujos.


🎨 Personalizando tu Gráfico de Acordes

Los gráficos de acordes son potentes, pero su impacto puede mejorarse significativamente con una buena personalización. hvPlot y holoviews ofrecen muchas opciones.

3.1. Ajustando Colores y Transparencia

Podemos controlar los colores de los arcos y acordes, así como la transparencia para mejorar la legibilidad, especialmente en gráficos densos.

# Crear un mapeo de colores para cada departamento
colors = {
    'Ingeniería': '#1f77b4',
    'Ciencias': '#ff7f0e',
    'Artes': '#2ca02c',
    'Medicina': '#d62728',
    'Negocios': '#9467bd'
}

# Generar el gráfico de acordes con colores personalizados y transparencia
chord_diagram_custom = df_matrix.hvplot.chord(
    width=700,
    height=700,
    title='Flujo de Estudiantes entre Departamentos (Personalizado)',
    cmap=list(colors.values()), # Usar nuestra lista de colores
    edge_cmap=list(colors.values()), # También para los bordes de los acordes
    edge_color='source', # Colorear bordes por el nodo de origen
    node_color='index', # Colorear nodos por su índice/nombre
    # Otras opciones de personalización estéticas
    line_width=0.5, # Grosor de la línea del acorde
    # alpha=0.7 # Transparencia de los acordes, se puede ajustar individualmente para los bordes y nodos
)

chord_diagram_custom
💡 **Consejo:** Usar `node_color='index'` y `edge_color='source'` (o `target`) es una excelente manera de hacer que los flujos sean más fáciles de seguir, ya que los colores de los acordes reflejarán los colores de los nodos de origen.

3.2. Cambiando Etiquetas y Títulos

Es fundamental que tu gráfico sea autodescriptivo. Puedes ajustar los títulos y las etiquetas de los nodos.

chord_diagram_labeled = df_matrix.hvplot.chord(
    width=650,
    height=650,
    title='Movimiento de Alumnos Universitarios por Departamento',
    label_index=departamentos, # Asegura que las etiquetas de los nodos sean correctas
    cmap=list(colors.values()),
    edge_color='source',
    node_color='index',
    node_label_size=10 # Tamaño de la fuente de las etiquetas de los nodos
)

chord_diagram_labeled

3.3. Configuración Avanzada con holoviews directamente

Para un control más granular, podemos trabajar directamente con los objetos holoviews. Primero, necesitamos transformar la matriz de adyacencia en un formato que holoviews.Chord entienda mejor: una lista de aristas (source, target, value).

# Transformar la matriz a formato de lista de aristas
links = df_matrix.stack().reset_index()
links.columns = ['source', 'target', 'value']
links = links[links['value'] > 0] # Eliminar conexiones con valor 0

# Crear el objeto Nodes para holoviews
nodes = hv.Dataset(pd.DataFrame(departamentos, columns=['name']), 'name')

# Crear el gráfico de acordes usando holoviews.Chord
hv_chord = hv.Chord(links, ['source', 'target'], ['value'])

hv_chord.opts(
    opts.Chord(
        cmap=list(colors.values()),
        edge_cmap=list(colors.values()),
        edge_color='source',
        node_color='index',
        labels='name', # Usar los nombres de los nodos como etiquetas
        node_width=0.05, # Ancho de los arcos de los nodos
        node_padding=0.1, # Espacio entre los nodos
        width=700,
        height=700,
        title="Flujo Interdepartamental de Estudiantes (hv.Chord)",
        label_text_font_size='10pt',
        inspection_tool=['hover'], # Activar el hover tool
        bgcolor='#f9f9f9' # Color de fondo
    )
)
📌 **Nota:** Para usar `opts.Chord`, necesitas importar `holoviews.opts` o `holoviews.plotting.opts` directamente. A menudo se hace al principio del script: `from holoviews import opts`.

📊 Casos de Uso Comunes de los Gráficos de Acordes

Los gráficos de acordes son versátiles y pueden aplicarse en diversas áreas:

  • Análisis de Redes: Visualización de interacciones entre usuarios en redes sociales, llamadas telefónicas, etc.
  • Economía y Finanzas: Flujos de comercio entre países, transacciones bancarias, movimientos de inversión.
  • Biología: Interacciones de proteínas, flujos genéticos entre poblaciones.
  • Transporte: Rutas de tráfico aéreo o marítimo, movimientos de personas entre ciudades.
  • Ciencias Sociales: Flujo de información, migraciones poblacionales, relaciones entre grupos.

Ejemplo: Matriz de Confusión Visual

Un caso de uso interesante es la visualización de una matriz de confusión para modelos de Machine Learning. Aquí, los nodos serían las clases verdaderas y predichas, y los acordes mostrarían la cantidad de instancias que fueron clasificadas de una clase a otra.

from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt # Solo para generar datos de ejemplo

# Datos de ejemplo: Clases verdaderas y predichas
y_true = np.random.randint(0, 3, size=100) # 3 clases
y_pred = np.random.randint(0, 3, size=100)

# Simular un buen modelo (más aciertos en la diagonal)
for i in range(len(y_true)):
    if np.random.rand() < 0.8: # 80% de probabilidad de predicción correcta
        y_pred[i] = y_true[i]

# Obtener la matriz de confusión
cm = confusion_matrix(y_true, y_pred)

# Nombres de las clases
class_names = ['Clase A', 'Clase B', 'Clase C']

df_cm = pd.DataFrame(cm, index=class_names, columns=class_names)

print("Matriz de Confusión:\n", df_cm)

# Visualizar la matriz de confusión como un gráfico de acordes
chord_cm = df_cm.hvplot.chord(
    width=600,
    height=600,
    title='Matriz de Confusión como Gráfico de Acordes',
    cmap=['#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99', '#e31a1c'],
    edge_color='source',
    node_color='index'
)

chord_cm
Gráfico de Acordes: Matriz de Predicción Relación entre clases verdaderas y predichas Clase A Clase B Clase C Correctas (Loop) Incorrectas (Puente) Grosor = Frecuencia

Este ejemplo muestra cómo las predicciones correctas se representan con flujos fuertes a sí mismos (lazos) y los errores de clasificación como flujos entre diferentes clases. Es una manera diferente y a veces más intuitiva de entender dónde falla un modelo.

⚠️ Consideraciones y Mejores Prácticas

Aunque los gráficos de acordes son potentes, tienen sus limitaciones y requieren un diseño cuidadoso:

  • Número de Nodos: Demasiados nodos (más de 20-30) pueden hacer que el gráfico sea ilegible y desordenado. Considera agrupar nodos o usar otras visualizaciones para datasets muy grandes.
  • Flujos Simétricos vs. Asimétricos: Aclara si tu gráfico representa flujos unidireccionales o bidireccionales. hvPlot por defecto maneja flujos direccionales cuando la matriz no es simétrica.
  • Etiquetado: Asegúrate de que las etiquetas de los nodos sean claras y legibles. Ajusta el tamaño de la fuente si es necesario.
  • Colores: Utiliza una paleta de colores que ayude a diferenciar los nodos y los flujos, pero evita el exceso de colores que puedan distraer. Colorear los bordes de los acordes por el origen (edge_color='source') es una práctica recomendada.
  • Interactividad: Aprovecha las herramientas de interactividad (zoom, hover) que ofrecen librerías como Bokeh o Plotly para permitir a los usuarios explorar los detalles del gráfico.
⚠️ **Advertencia:** Evita el uso de degradados de color muy sutiles si la distinción entre flujos es crucial. Prioriza la claridad sobre la estética compleja en gráficos con mucha información.

⏭️ Próximos Pasos y Exploración Adicional

Has aprendido a crear gráficos de acordes básicos y personalizados en Python. Para llevar tus habilidades al siguiente nivel, considera:

  • Datos Reales: Aplica estos gráficos a tus propios conjuntos de datos para descubrir nuevas ideas.
  • Otras Librerías: Explora otras librerías como circos (aunque más compleja y basada en R, hay adaptaciones en Python) o la integración directa de Plotly con gráficos de tipo Chord (a menudo a través de Sankey con adaptaciones).
  • Combinar con Otras Visualizaciones: A veces, un gráfico de acordes puede ser parte de un dashboard más grande, complementado con histogramas, tablas o gráficos de barras para ofrecer una vista completa de los datos.
  • Animaciones: Para series temporales de datos, considera animar los cambios en el gráfico de acordes para mostrar la evolución de las conexiones a lo largo del tiempo.

Los gráficos de acordes son una herramienta poderosa en tu arsenal de visualización de datos. Con práctica y experimentación, podrás desvelar conexiones y patrones complejos en tus datos de una manera que los gráficos tradicionales no pueden. ¡Anímate a explorar y compartir tus descubrimientos!

Tutoriales relacionados

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!