Crear un diagrama de Sankey

Beginner

This tutorial is from open-source community. Access the source code

Introducción

En este tutorial, aprenderemos cómo crear un diagrama de Sankey utilizando la biblioteca Matplotlib de Python. Los diagramas de Sankey son un tipo de diagrama de flujo que se utilizan comúnmente para visualizar el flujo de energía o materiales a través de un sistema. Son especialmente útiles para analizar sistemas complejos con múltiples entradas y salidas.

Consejos sobre la VM

Una vez finalizada la inicialización de la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.

Importar las bibliotecas necesarias

Comenzaremos importando las bibliotecas necesarias para crear diagramas de Sankey utilizando Matplotlib. Importaremos la clase Sankey del módulo matplotlib.sankey, y el módulo pyplot de Matplotlib.

import matplotlib.pyplot as plt
from matplotlib.sankey import Sankey

Definir los datos

A continuación, definiremos los datos que queremos visualizar utilizando el diagrama de Sankey. En este ejemplo, utilizaremos los datos del Ejemplo 8.6 de "Fundamentals of Engineering Thermodynamics" de Moran y Shapiro. Los datos representan el flujo de energía a través de un ciclo de potencia de Rankine. Definiremos los flujos de energía como una lista de valores.

Hdot = [260.431, 35.078, 180.794, 221.115, 22.700,
        142.361, 10.193, 10.210, 43.670, 44.312,
        68.631, 10.758, 10.758, 0.017, 0.642,
        232.121, 44.559, 100.613, 132.168]  ## MW

Crear la figura y los ejes

Crearemos un objeto de figura y le agregaremos un único conjunto de ejes. También estableceremos el título de la gráfica.

fig = plt.figure(figsize=(8, 9))
ax = fig.add_subplot(1, 1, 1, xticks=[], yticks=[],
                     title="Rankine Power Cycle: Example 8.6 from Moran and "
                     "Shapiro\n\x22Fundamentals of Engineering Thermodynamics "
                     "\x22, 6th ed., 2008")

Crear el diagrama de Sankey

Crearemos una instancia de la clase Sankey y le pasaremos el objeto de ejes que creamos en el paso 3. También estableceremos el formato de los valores de flujo y la unidad de medida. Luego agregaremos los flujos al diagrama utilizando el método add. Especificaremos el color de cada flujo utilizando el parámetro facecolor, y las etiquetas de cada flujo utilizando el parámetro labels. También especificaremos las longitudes de camino para cada flujo utilizando el parámetro pathlengths y la orientación de cada flujo utilizando el parámetro orientations. Finalmente, conectaremos los flujos utilizando el parámetro connect.

sankey = Sankey(ax=ax, format='%.3G', unit=' MW', gap=0.5, scale=1.0/Hdot[0])
sankey.add(patchlabel='\n\nBomba 1', rotation=90, facecolor='#37c959',
           flows=[Hdot[13], Hdot[6], -Hdot[7]],
           labels=['Potencia del eje', '', Ninguno],
           pathlengths=[0.4, 0.883, 0.25],
           orientations=[1, -1, 0])
sankey.add(patchlabel='\n\nCalentador\nabierto', facecolor='#37c959',
           flows=[Hdot[11], Hdot[7], Hdot[4], -Hdot[8]],
           labels=[Ninguno, '', Ninguno, Ninguno],
           pathlengths=[0.25, 0.25, 1.93, 0.25],
           orientations=[1, 0, -1, 0], prior=0, connect=(2, 1))
sankey.add(patchlabel='\n\nBomba 2', facecolor='#37c959',
           flows=[Hdot[14], Hdot[8], -Hdot[9]],
           labels=['Potencia del eje', '', Ninguno],
           pathlengths=[0.4, 0.25, 0.25],
           orientations=[1, 0, 0], prior=1, connect=(3, 1))
sankey.add(patchlabel='Calentador\ncerrado', trunklength=2.914, fc='#37c959',
           flows=[Hdot[9], Hdot[1], -Hdot[11], -Hdot[10]],
           pathlengths=[0.25, 1.543, 0.25, 0.25],
           labels=['', '', Ninguno, Ninguno],
           orientations=[0, -1, 1, -1], prior=2, connect=(2, 0))
sankey.add(patchlabel='Trampa', facecolor='#37c959', trunklength=5.102,
           flows=[Hdot[11], -Hdot[12]],
           labels=['\n', Ninguno],
           pathlengths=[1.0, 1.01],
           orientations=[1, 1], prior=3, connect=(2, 0))
sankey.add(patchlabel='Generador\nde vapor', facecolor='#ff5555',
           flows=[Hdot[15], Hdot[10], Hdot[2], -Hdot[3], -Hdot[0]],
           labels=['Tasa de calor', '', '', Ninguno, Ninguno],
           pathlengths=0.25,
           orientations=[1, 0, -1, -1, -1], prior=3, connect=(3, 1))
sankey.add(patchlabel='\n\n\nTurbina 1', facecolor='#37c959',
           flows=[Hdot[0], -Hdot[16], -Hdot[1], -Hdot[2]],
           labels=['', Ninguno, Ninguno, Ninguno],
           pathlengths=[0.25, 0.153, 1.543, 0.25],
           orientations=[0, 1, -1, -1], prior=5, connect=(4, 0))
sankey.add(patchlabel='\n\n\nRecalentamiento', facecolor='#37c959',
           flows=[Hdot[2], -Hdot[2]],
           labels=[Ninguno, Ninguno],
           pathlengths=[0.725, 0.25],
           orientations=[-1, 0], prior=6, connect=(3, 0))
sankey.add(patchlabel='Turbina 2', trunklength=3.212, facecolor='#37c959',
           flows=[Hdot[3], Hdot[16], -Hdot[5], -Hdot[4], -Hdot[17]],
           labels=[Ninguno, 'Potencia del eje', Ninguno, '', 'Potencia del eje'],
           pathlengths=[0.751, 0.15, 0.25, 1.93, 0.25],
           orientations=[0, -1, 0, -1, 1], prior=6, connect=(1, 1))
sankey.add(patchlabel='Condensador', facecolor='#58b1fa', trunklength=1.764,
           flows=[Hdot[5], -Hdot[18], -Hdot[6]],
           labels=['', 'Tasa de calor', Ninguno],
           pathlengths=[0.45, 0.25, 0.883],
           orientations=[-1, 1, 0], prior=8, connect=(2, 0))

Agregar etiquetas y formato

Agregaremos etiquetas a los parches en el diagrama de Sankey utilizando el atributo text de cada parche. También formatearemos el texto para que sea en negrita y aumentaremos el tamaño de la fuente.

diagrams = sankey.finish()
for diagram in diagrams:
    diagram.text.set_fontweight('bold')
    diagram.text.set_fontsize('10')
    for text in diagram.texts:
        text.set_fontsize('10')

Mostrar la gráfica

Finalmente, mostraremos el diagrama de Sankey utilizando el método show del módulo pyplot.

plt.show()

Resumen

En este tutorial, aprendimos cómo crear un diagrama de Sankey utilizando la biblioteca Matplotlib de Python. Utilizamos la clase Sankey del módulo matplotlib.sankey para crear el diagrama, y agregamos etiquetas y formato al diagrama utilizando el atributo text de cada parche. Los diagramas de Sankey son una herramienta útil para visualizar el flujo de energía o materiales a través de un sistema complejo.