Sankey Diagram

Sankey Diagram

Categoría Flujo

Qué es

Flujos representados por flechas o bandas cuyo grosor es proporcional a la cantidad que fluye. Los nodos son categorías y las bandas son las transferencias entre ellas.

Para qué sirve

Para mostrar cómo una cantidad se distribuye o transforma a través de etapas o categorías, cuando las magnitudes de los flujos importan.

Cómo leerlo

Anatomía

El diagrama que hoy conocemos con este nombre se popularizó a fines del siglo XIX, comparando la eficiencia térmica de una máquina real contra una ideal, y ganó adopción más amplia ya en el siglo XX al aplicarse a sistemas de energía y flujo de materiales, especialmente en contextos donde escaseaban los recursos y hacía falta visualizar con precisión dónde se perdía eficiencia. El principio de ancho proporcional al flujo tiene antecedentes cartográficos incluso anteriores, aplicados a mapas de rutas comerciales y militares, aunque sin la estructura de nodos y ramificaciones que define a este formato propiamente tal. La propiedad que ningún otro gráfico de flujo de este catálogo comparte con tanta exactitud es la conservación estricta: la suma del ancho de las bandas que salen de un nodo es exactamente igual al ancho del nodo mismo, no una aproximación visual sino una restricción matemática del layout —a diferencia de un treemap, donde el área codifica la proporción de un todo estático, no un flujo que se conserva de una etapa a la siguiente.

Raíces de un árbol grande que se ramifican desde un tronco único en decenas de brazos de grosor decreciente: la misma lógica de un sankey diagram, donde el ancho del trazo codifica el volumen de flujo que se va dividiendo

Por qué funciona

Fundamento perceptivo

Es el único gráfico que muestra simultáneamente origen, destino y magnitud de múltiples flujos. El grosor hace que las cantidades sean inmediatamente comparables.

Errores comunes

  • Ilegible con muchos nodos

    con más de 8-10 nodos y muchas conexiones cruzadas se satura, así que ordena los nodos para minimizar cruces y agrupa categorías pequeñas en 'Otros'.

Dónde se usa

Contextos de aplicación

Flujos de carga entre puertos
01

Flujos de carga entre puertos

El ancho de cada banda es el volumen que se mueve por esa ruta.

Distribución del presupuesto por etapas
02

Distribución del presupuesto por etapas

Del total a los programas: cada peso se sigue por su banda.

Recorrido de usuarios en un sitio
03

Recorrido de usuarios en un sitio

De la portada a la conversión: dónde se bifurca y dónde se pierde el flujo.

Cómo construirlo

El mismo gráfico, en 11 librerías open source

Cada librería resuelve las mismas decisiones de diseño, como la escala, el espaciado entre barras o la inserción de la etiqueta de valor, de un modo distinto. Algunas las automatizan; otras las dejan explícitas en el código, a criterio de quien lo escribe. Comparar once implementaciones con los mismos datos y el mismo color de marca aísla esa diferencia, que de otro modo queda oculta detrás de estilos visuales distintos.

A quién le vende Chile su cobre, con más detalle

Fuente: BCN, en base a Cochilco (2025a), BCCh y Aduanas

Matplotlib License (estilo BSD)
Matplotlib: gráfico de barras

Exportaciones de cobre chileno 2024 por destino, en millones de US$ (mismos datos que el ejemplo principal de esta ficha): BCN, en base a Cochilco (2025a), BCCh y Aduanas. ECharts y Plotly tienen un tipo Sankey nativo que calcula solo el layout (columnas, apilado por valor, bandas curvas); las demás 7 necesitan esa geometría ya resuelta a mano, sin el paquete d3-sankey (no instalado en este proyecto). Sin función Sankey nativa: matplotlib solo dibuja Rectangle para los nodos y PathPatch (curvas Bézier) para las bandas de flujo, con el layout ya resuelto a mano.

import matplotlib.pyplot as plt
import matplotlib.patches as patches
from matplotlib.path import Path

# Sin funcion Sankey nativa: el layout (columnas, apilado por valor,
# bandas curvas) viene ya resuelto a mano -- matplotlib solo dibuja
# Rectangle para los nodos y PathPatch (curvas Bezier) para las bandas.
for l in bandas:
    verts = [(l["sx"], l["sy0"]), (mx, l["sy0"]), (mx, l["ty0"]), (l["tx"], l["ty0"]), ...]
    ax.add_patch(patches.PathPatch(Path(verts, codes), facecolor="#760D3E", alpha=0.35))
for n in nodos:
    ax.add_patch(patches.Rectangle((n["x"], n["y0"]), 16, n["y1"] - n["y0"], facecolor=n["color"]))
plt.show()

No disponible en estas librerías

ApexCharts

No tiene un tipo Sankey nativo ni una API de bajo nivel accesible desde fuera para dibujar bandas de flujo a mano.

Vega-Lite

No tiene un mark Sankey ni un mark de "link"/banda de ancho variable —esa capacidad de bajo nivel existe en Vega (la librería completa de la que Vega-Lite es un subconjunto simplificado), no en Vega-Lite.

Herramientas para construirlo

No-code, desktop y plataformas web, con su licencia visible, abierta o comercial.

No-code
Flourish FreemiumDatawrapper FreemiumRAWGraphs GratisPower BI ComercialObservable Freemium
JavaScript
D3.js Open SourceECharts Open SourceHighcharts Comercial
Python
Plotly Open Source
R
ggalluvial Open Source

Con datos reales

Ejemplos de uso.

A quién le vende Chile su cobre, con más detalle

Exportaciones de cobre 2024 por destino (millones de US$).

Fuente: BCN, en base a Cochilco (2025a), BCCh y Aduanas

Gráficos relacionados

Variantes y alternativas cercanas.