Introdução
Neste tutorial, aprenderemos como criar um diagrama de Sankey usando a biblioteca Matplotlib do Python. Diagramas de Sankey são um tipo de diagrama de fluxo que são comumente usados para visualizar o fluxo de energia ou materiais através de um sistema. Eles são especialmente úteis para analisar sistemas complexos com múltiplas entradas e saídas.
Dicas para a VM
Após a inicialização da VM, clique no canto superior esquerdo para mudar para a aba Notebook e acessar o Jupyter Notebook para praticar.
Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.
Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão, e resolveremos o problema prontamente para você.
Importar as Bibliotecas Necessárias
Começaremos importando as bibliotecas necessárias para criar diagramas de Sankey usando Matplotlib. Importaremos a classe Sankey do módulo matplotlib.sankey e o módulo pyplot de Matplotlib.
import matplotlib.pyplot as plt
from matplotlib.sankey import Sankey
Definir os Dados
Em seguida, definiremos os dados que queremos visualizar usando o diagrama de Sankey. Neste exemplo, usaremos os dados do Exemplo 8.6 de "Fundamentals of Engineering Thermodynamics" de Moran e Shapiro. Os dados representam o fluxo de energia através de um ciclo de potência Rankine. Definiremos os fluxos de energia como uma 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
Criar a Figura e os Eixos
Criaremos um objeto de figura e adicionaremos um único conjunto de eixos a ele. Também definiremos o título do gráfico.
fig = plt.figure(figsize=(8, 9))
ax = fig.add_subplot(1, 1, 1, xticks=[], yticks=[],
title="Ciclo de Potência Rankine: Exemplo 8.6 de Moran e "
"Shapiro\n\x22Fundamentals of Engineering Thermodynamics "
"\x22, 6th ed., 2008")
Criar o Diagrama de Sankey
Criaremos uma instância da classe Sankey e passaremos o objeto de eixos que criamos na etapa 3. Também definiremos o formato dos valores de fluxo e a unidade de medida. Em seguida, adicionaremos os fluxos ao diagrama usando o método add. Especificaremos a cor de cada fluxo usando o parâmetro facecolor e os rótulos para cada fluxo usando o parâmetro labels. Também especificaremos os comprimentos dos caminhos para cada fluxo usando o parâmetro pathlengths e a orientação de cada fluxo usando o parâmetro orientations. Finalmente, conectaremos os fluxos usando o parâmetro connect.
sankey = Sankey(ax=ax, format='%.3G', unit=' MW', gap=0.5, scale=1.0/Hdot[0])
sankey.add(patchlabel='\n\nPump 1', rotation=90, facecolor='#37c959',
flows=[Hdot[13], Hdot[6], -Hdot[7]],
labels=['Shaft power', '', None],
pathlengths=[0.4, 0.883, 0.25],
orientations=[1, -1, 0])
sankey.add(patchlabel='\n\nOpen\nheater', facecolor='#37c959',
flows=[Hdot[11], Hdot[7], Hdot[4], -Hdot[8]],
labels=[None, '', None, None],
pathlengths=[0.25, 0.25, 1.93, 0.25],
orientations=[1, 0, -1, 0], prior=0, connect=(2, 1))
sankey.add(patchlabel='\n\nPump 2', facecolor='#37c959',
flows=[Hdot[14], Hdot[8], -Hdot[9]],
labels=['Shaft power', '', None],
pathlengths=[0.4, 0.25, 0.25],
orientations=[1, 0, 0], prior=1, connect=(3, 1))
sankey.add(patchlabel='Closed\nheater', trunklength=2.914, fc='#37c959',
flows=[Hdot[9], Hdot[1], -Hdot[11], -Hdot[10]],
pathlengths=[0.25, 1.543, 0.25, 0.25],
labels=['', '', None, None],
orientations=[0, -1, 1, -1], prior=2, connect=(2, 0))
sankey.add(patchlabel='Trap', facecolor='#37c959', trunklength=5.102,
flows=[Hdot[11], -Hdot[12]],
labels=['\n', None],
pathlengths=[1.0, 1.01],
orientations=[1, 1], prior=3, connect=(2, 0))
sankey.add(patchlabel='Steam\ngenerator', facecolor='#ff5555',
flows=[Hdot[15], Hdot[10], Hdot[2], -Hdot[3], -Hdot[0]],
labels=['Heat rate', '', '', None, None],
pathlengths=0.25,
orientations=[1, 0, -1, -1, -1], prior=3, connect=(3, 1))
sankey.add(patchlabel='\n\n\nTurbine 1', facecolor='#37c959',
flows=[Hdot[0], -Hdot[16], -Hdot[1], -Hdot[2]],
labels=['', None, None, None],
pathlengths=[0.25, 0.153, 1.543, 0.25],
orientations=[0, 1, -1, -1], prior=5, connect=(4, 0))
sankey.add(patchlabel='\n\n\nReheat', facecolor='#37c959',
flows=[Hdot[2], -Hdot[2]],
labels=[None, None],
pathlengths=[0.725, 0.25],
orientations=[-1, 0], prior=6, connect=(3, 0))
sankey.add(patchlabel='Turbine 2', trunklength=3.212, facecolor='#37c959',
flows=[Hdot[3], Hdot[16], -Hdot[5], -Hdot[4], -Hdot[17]],
labels=[None, 'Shaft power', None, '', 'Shaft power'],
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='Condenser', facecolor='#58b1fa', trunklength=1.764,
flows=[Hdot[5], -Hdot[18], -Hdot[6]],
labels=['', 'Heat rate', None],
pathlengths=[0.45, 0.25, 0.883],
orientations=[-1, 1, 0], prior=8, connect=(2, 0))
Adicionar Rótulos e Formatação
Adicionaremos rótulos aos patches no diagrama de Sankey usando o atributo text de cada patch. Também formataremos o texto para ser negrito e aumentaremos o tamanho da fonte.
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 o Gráfico
Finalmente, mostraremos o diagrama de Sankey usando o método show do módulo pyplot.
plt.show()
Resumo
Neste tutorial, aprendemos como criar um diagrama de Sankey usando a biblioteca Matplotlib do Python. Usamos a classe Sankey do módulo matplotlib.sankey para criar o diagrama, e adicionamos rótulos e formatação ao diagrama usando o atributo text de cada patch. Diagramas de Sankey são uma ferramenta útil para visualizar o fluxo de energia ou materiais através de um sistema complexo.