Plotly サンキーダイアグラム

このチュートリアルでは、Plotly のグラフオブジェクトの Sankey()
関数を使用してサンキーダイアグラムを作成する方法について説明します。
Plotly サンキーダイアグラム
サンキーダイアグラムは、さまざまなノードがリンクを介して接続するフローダイアグラムとしてデータを表します。リンクの幅はノードの値を表します。
plotly.graph_object
の Sankey()
関数を使用して、サンキーダイアグラムを作成できます。Sankey()
関数には、ノードとリンクの 2つの主要な引数があります。node
引数内に、各ノードのラベルを定義するラベルを渡すことができます。
ノードの色、ノードの厚さ、および各ノード間の距離を渡すこともできます。リンクのソース、ターゲット、値などのリンク引数内にリンク情報を渡すことができます。
ノードラベルのインデックスを使用して、ソースノードとターゲットノードを指定できます。値は任意の整数にすることができます。たとえば、最初の 2つのノードを接続する場合は、ソースリストに 0 を渡し、ターゲットリストに 1 を渡します。
たとえば、6つのノードのサンキーダイアグラムを作成してみましょう。以下のコードを参照してください。
import plotly.graph_objects as go
fig = go.Figure(data=[go.Sankey(
node = dict(
pad = 50,
thickness = 5,
label = ["A", "B", "C", "D", "E", "F"],
color = "blue"
),
link = dict(
source = [0, 1, 0, 2, 3, 3],
target = [5, 3, 3, 4, 4, 5],
value = [3, 4, 2, 8, 4, 2]
))])
fig.show()
出力:
ノードの色を Plotly でサポートされている任意の色に変更できます。color
引数内に 1つの色のみを渡すと、すべてのノードが同じ色になります。
単一の色名の代わりに色名のリストを使用して、各ノードに異なる色を付けることができます。各ノードの色を変更するのと同じ方法で、各リンクの色を変更することもできます。
node
パラメータ内の line 引数を使用して、各ノードの周囲に線を追加することもできます。また、線の色と幅を設定することもできます。update_layout
関数の title_text
引数を使用して図にタイトルを追加できます。また、font_size
引数を使用してテキストフォントを設定することもできます。
valueformat
引数を使用してリンクにカーソルを合わせると、表示される値の形式を設定できます。valuesuffix
引数を使用して、各値の後にサフィックスを追加することもできます。
orientation
引数を使用してサンキーダイアグラムの方向を変更し、その値を垂直方向の場合は v に、水平方向の場合は h に設定することもできます。
update_layout()
関数内の plot_bgcolor
および paper_bgcolor
引数を使用して、プロットの背景色と紙の背景色を変更することもできます。
hovertemplate
引数を使用して、カーソルがリンクまたはノードにカーソルを合わせたときに表示する情報を変更することもできます。ホバーボックス内に変数の値を表示する場合は、パーセント記号を使用して、中括弧内に変数名を入れることができます。
上記のプロパティを変更してみましょう。以下のコードを参照してください。
import plotly.graph_objects as go
fig = go.Figure(data=[go.Sankey(
valueformat = ".0f",
valuesuffix = " kg",
orientation = "v",
node = dict(
pad = 50,
thickness = 10,
line = dict(color = "red", width = 2),
label = ["A", "B", "C", "D", "E", "F"],
color = ["blue","red","green","yellow","brown"]
),
link = dict(
source = [0, 1, 0, 2, 3, 3],
target = [5, 3, 3, 4, 4, 5],
value = [3, 4, 2, 8, 4, 2],
color = ["blue","red","green","yellow","brown"],
hovertemplate='This link has total value %{value}<extra></extra>'
))])
fig.update_layout(title_text="Sankey Diagram",
font_size=16,
plot_bgcolor='white',
paper_bgcolor='lightblue')
fig.show()
出力: