サンキー図の生成とカスタマイズに関するコード解説

このコードは、Pythonのplotly.graph_objectsモジュールを使用してサンキー図を作成し、カスタマイズする方法を示しています。サンキー図は、フローやプロセス内の要素間の流れを視覚的に表現するために使われる図で、特に大規模なシステムや複雑なプロセスを可視化する際に役立ちます。

![スクリーンショット 2024-08-29 15.09.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398994/863274cf-7c4a-91d9-fdbe-7e821ffd19af.png)


以下、このコードの各部分について説明します。

## 1. ライブラリのインポート
```python
import plotly.graph_objects as go
```

まず、plotly.graph_objectsライブラリをインポートします。このライブラリは、Plotlyで様々なグラフを作成するために使用されます。

### 2. ノードのラベルと値を定義
```python
labels = ["自動車", "金融", "その他", "営業収益", "販管費", "営業利益", "その他費用", "純利益"]
values = [41.2, 3.4, 1.3, 45.9, 39.7, 6.2, 0.3, 5.0]
```
ここでは、サンキー図に表示されるノードのラベルと、それぞれのノードに対応する値（兆円単位）を定義しています。これらのノードは、企業の異なる部門や収益項目を表しています。

## 3. ラベルに値を追加
```python
labels_with_values = [f"{label} ({value:,}兆)" for label, value in zip(labels, values)]
```
この部分では、ノードのラベルに対応する値を追加し、より詳細な情報を表示するようにしています。例えば、「自動車 (41.2兆)」のように表示されます。

### 4. ソースとターゲットのインデックスを定義
```python
source = [0, 1, 2, 3, 3, 5, 5]
target = [3, 3, 3, 4, 5, 6, 7]
```
sourceとtargetは、サンキー図内でフローが始まるノードと終わるノードをそれぞれ指定します。これにより、どのノードがどのノードにフローするかを決定します。

### 5. フローの値を定義
```python
value = [41.2, 3.4, 1.3, 39.7, 6.2, 0.3, 5.0]
```
valueリストは、sourceとtarget間のフローの大きさを指定しています。これにより、各フローの幅が決まります。

6. ノードの色を定義
```python

node_colors = ["#2b8bba", "#2f5f98", "#31356e", "#41b8d5", "#2b8bba", "#6ce5e8", "#2f5f98", "#31356e"]
```
ノードの視覚的な識別を容易にするため、各ノードに色を割り当てています。

### 7. リンクの色を定義
```python

special_links = {(3, 4), (5, 6)}
link_colors = [
    "rgba(43,139,186,0.5)" if s < 3 else
    "rgba(49,53,110,0.5)" if (s, t) in special_links else
    f"rgba({43 if node_colors[s] == '#41b8d5' else 49},{128 if node_colors[s] == '#41b8d5' else 53},{110 if node_colors[s] == '#41b8d5' else 110},0.4)"
    for s, t in zip(source, target)
]
```
link_colorsは、フロー（リンク）の色を決定します。特定の条件に基づいてリンクの色を変更し、視覚的に重要なリンクを際立たせています。

### 8. サンキー図の作成
```python
fig = go.Figure(data=[go.Sankey(
    node=dict(
        pad=15,
        thickness=20,
        line=dict(color="black", width=0),
        label=labels_with_values,
        color=node_colors
    ),
    link=dict(
        source=source,
        target=target,
        value=value,
        color=link_colors
    )
)])
```
go.Figureを使用してサンキー図を作成します。node引数ではノードの配置やスタイルを設定し、link引数ではフローの設定を行います。

### 9. フィギュアのレイアウトをカスタマイズ
```python

fig.update_layout(
    font=dict(
        family="RoundedM+, sans-serif",
        size=30
    ),
    height=600,
    width=2000,
    plot_bgcolor='white',
    paper_bgcolor='white'
)
```
ここでは、フィギュア全体のレイアウトをカスタマイズしています。フォントをRoundedM+に設定し、サイズを30ポイントに調整しています。また、背景色を白に変更して、清潔感のある見た目にしています。

### 10. サンキー図の表示
```python
fig.show()
```
最後に、fig.show()を使用してサンキー図を表示します。

### まとめ
このコードは、企業の異なる部門や収益項目を視覚的に表現するためのサンキー図を作成する手順を示しています。カスタムの色、フォント、レイアウト設定を活用して、視覚的に魅力的な図表を作成することができます。

```python
import plotly.graph_objects as go

#ノードのラベルと値を更新
labels = ["自動車", "金融", "その他", "営業収益", "販管費", "営業利益", "その他費用", "純利益"]
values = [41.2, 3.4, 1.3, 45.9, 39.7, 6.2, 0.3, 5.0]

#ラベルに値を追加
labels_with_values = [f"{label} ({value:,}兆)" for label, value in zip(labels, values)]

#ソースとターゲットのインデックスを更新
source = [0, 1, 2, 3, 3, 5, 5]
target = [3, 3, 3, 4, 5, 6, 7]

#値を更新
value = [41.2, 3.4, 1.3, 39.7, 6.2, 0.3, 5.0]

#ノードの色を更新（指定された色を使用）
node_colors = ["#2b8bba", "#2f5f98", "#31356e", "#41b8d5", "#2b8bba", "#6ce5e8", "#2f5f98", "#31356e"]

#特定のリンクの色を設定
special_links = {(3, 4), (5, 6)} # インデックスを調整

#リンクの色を設定
link_colors = [
"rgba(43,139,186,0.5)" if s < 3 else # 内訳ノードからのリンクはブルー系
"rgba(49,53,110,0.5)" if (s, t) in special_links else
f"rgba({43 if node_colors[s] == '#41b8d5' else 49},{128 if node_colors[s] == '#41b8d5' else 53},{110 if node_colors[s] == '#41b8d5' else 110},0.4)"
for s, t in zip(source, target)
]

fig = go.Figure(data=[go.Sankey(
node=dict(
pad=15,
thickness=20,
line=dict(color="black", width=0),
label=labels_with_values,
color=node_colors
),
link=dict(
source=source,
target=target,
value=value,
color=link_colors
))])

#フィギュアのレイアウトを更新
fig.update_layout(
font=dict(
family="RoundedM+, sans-serif",
size=30
),
height=600,
width=2000,
plot_bgcolor='white',
paper_bgcolor='white'
)

fig.show()
```