소개
이 튜토리얼에서는 Python 의 Matplotlib 라이브러리를 사용하여 Sankey 다이어그램을 만드는 방법을 배웁니다. Sankey 다이어그램은 시스템을 통해 에너지 또는 물질의 흐름을 시각화하는 데 일반적으로 사용되는 흐름 다이어그램의 한 유형입니다. 여러 입력과 출력이 있는 복잡한 시스템을 분석하는 데 특히 유용합니다.
VM 팁
VM 시작이 완료되면 왼쪽 상단을 클릭하여 Notebook 탭으로 전환하여 실습을 위해 Jupyter Notebook에 액세스하십시오.
때로는 Jupyter Notebook 이 로딩을 완료하는 데 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한 사항으로 인해 작업의 유효성 검사는 자동화할 수 없습니다.
학습 중에 문제가 발생하면 Labby 에게 문의하십시오. 세션 후 피드백을 제공하면 문제를 즉시 해결해 드리겠습니다.
필요한 라이브러리 가져오기
Matplotlib 를 사용하여 Sankey 다이어그램을 만드는 데 필요한 라이브러리를 가져오는 것으로 시작합니다. matplotlib.sankey 모듈에서 Sankey 클래스를 가져오고, Matplotlib 에서 pyplot 모듈을 가져옵니다.
import matplotlib.pyplot as plt
from matplotlib.sankey import Sankey
데이터 정의
다음으로, Sankey 다이어그램을 사용하여 시각화하려는 데이터를 정의합니다. 이 예제에서는 Moran 과 Shapiro 의 "Fundamentals of Engineering Thermodynamics"의 예제 8.6 의 데이터를 사용합니다. 이 데이터는 Rankine 동력 사이클을 통한 에너지 흐름을 나타냅니다. 에너지 흐름을 값의 목록으로 정의합니다.
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
Figure 및 Axes 생성
figure 객체를 생성하고 단일 축 집합을 추가합니다. 또한 플롯의 제목을 설정합니다.
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")
Sankey 다이어그램 생성
Sankey 클래스의 인스턴스를 생성하고 3 단계에서 생성한 axes 객체를 전달합니다. 또한 흐름 값의 형식과 측정 단위를 설정합니다. 그런 다음 add 메서드를 사용하여 다이어그램에 흐름을 추가합니다. facecolor 매개변수를 사용하여 각 흐름의 색상을 지정하고, labels 매개변수를 사용하여 각 흐름의 레이블을 지정합니다. 또한 pathlengths 매개변수를 사용하여 각 흐름의 경로 길이를 지정하고, orientations 매개변수를 사용하여 각 흐름의 방향을 지정합니다. 마지막으로, 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))
레이블 및 서식 추가
각 패치의 text 속성을 사용하여 Sankey 다이어그램의 패치에 레이블을 추가합니다. 또한 텍스트를 굵게 표시하고 글꼴 크기를 늘립니다.
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')
플롯 표시
마지막으로, pyplot 모듈의 show 메서드를 사용하여 Sankey 다이어그램을 표시합니다.
plt.show()
요약
이 튜토리얼에서는 Python 의 Matplotlib 라이브러리를 사용하여 Sankey 다이어그램을 만드는 방법을 배웠습니다. matplotlib.sankey 모듈의 Sankey 클래스를 사용하여 다이어그램을 만들었고, 각 패치의 text 속성을 사용하여 다이어그램에 레이블과 서식을 추가했습니다. Sankey 다이어그램은 복잡한 시스템을 통해 에너지 또는 물질의 흐름을 시각화하는 데 유용한 도구입니다.