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.