サンキー図の作成

Beginner

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

はじめに

このチュートリアルでは、Python の Matplotlib ライブラリを使ってサンキー図を作成する方法を学びます。サンキー図は、システムを通じたエネルギーや物質の流れを視覚化するために一般的に使用されるフローダイアグラムの一種です。複数の入力と出力を持つ複雑なシステムの分析に特に役立ちます。

VM のヒント

VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。

時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要がある場合があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。

学習中に問題に遭遇した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。

必要なライブラリをインポートする

Matplotlib を使ってサンキー図を作成するために必要なライブラリをインポートします。matplotlib.sankeyモジュールからSankeyクラスと、Matplotlib のpyplotモジュールをインポートします。

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

データを定義する

次に、サンキー図を使って視覚化したいデータを定義します。この例では、Moran と Shapiro の「Fundamentals of Engineering Thermodynamics」の例 8.6 のデータを使用します。このデータは、ランキンサイクルを通じたエネルギーの流れを表しています。エネルギーの流れを値のリストとして定義します。

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

グラフと軸を作成する

グラフオブジェクトを作成し、それに 1 セットの軸を追加します。また、グラフのタイトルも設定します。

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クラスのインスタンスを作成し、手順 3 で作成した軸オブジェクトを渡します。また、流量値の形式と測定単位を設定します。そして、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属性を使ってラベルを追加します。また、テキストを太字にフォーマットし、フォントサイズを大きくします。

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メソッドを使ってサンキー図を表示します。

plt.show()

まとめ

このチュートリアルでは、Python の Matplotlib ライブラリを使ってサンキー図を作成する方法を学びました。matplotlib.sankeyモジュールのSankeyクラスを使って図を作成し、各パッチのtext属性を使って図にラベルとフォーマットを追加しました。サンキー図は、複雑なシステムを通るエネルギーや物質の流れを視覚化するための便利なツールです。