🐈

可視化の殿堂:サンキー図📈

に公開

概要

最近, レビュー論文を読んでいるときに度々見かける図がある.
それは以下の図のように, キーワード間を波のような線で繋いだチャートである.

このような図を、サンキー図というらしい.

筆者自身, 情報の可視化を考えたときに,このようなサンキー図を書きたいと思い, 可視化ツールや簡単なサンプルをまとめておくことにした.

本編

サンキー図とは

まずサンキー図とはそもそも何か? 説明しておく.
Wikipediaによると,

サンキー・ダイアグラム(英語: Sankey diagram)は工程間の流量を表現する図表である。矢印の太さで流れの量を表している。特にエネルギーや物資、経費等の変位を表す為に使われる。 Sankeyの名前の由来は1898年に初めてこの形式の表を用いた公刊物(Minutes of Proceedings of The Institution of Civil Engineers中の蒸気機関におけるエネルギー効率についての記事)の著者であるアイルランド人ヘンリー・フィニアス・リオル・サンキーに因む。

とのことで, 驚くことに, キーワードの可視化のための図ではない, 全く違った分野に由来をもつ.

可視化ツール

誰かが このサンキー図をキーワード間の関係性を図示する, のに適していると判断した.
そして, サンキー図を作成するための可視化ツールも複数用意されている.

プログラミング系

  • Python
  • R
    • ggalluvial(ggplot2拡張)
    • networkD3::sankeyNetwork
  • JavaScript
    • D3.js(サンキー図ライブラリあり)

https://qiita.com/natsuriver/items/a65b3c15165db561bcfa#fn-1

D3 での実装はこちらから

専用ソフトウェア系

  • Tableau(カスタムでサンキー図可視化可能)
  • RAWGraphs(Webベース、Sankey/Alluvial対応)
  • Gephi(ネットワーク可視化全般、プラグインでサンキー風可)

ブラウザ系

データを手作業で入力するという手間は発生するが, プログラミングなしでサンキー図を作成できるサイトも存在する.

https://note.com/hiroki143/n/nca4eb5bf4680

上記も参考に

事例

練習として, plotlyでの実装例をあげておく.事前に plotlyのインストールをしておこう.

pip install plotly
Sankey
import plotly.graph_objects as go

# ノードの定義
labels = [
    # 著者
    "phillips_sm", "tipton_kd", "moore_dr", 
    "vanloon_ljc", "candow_dg",

    # 国
    "usa", "canada", "brazil", "netherlands",

    # 大学
    "mcmaster university", "university of texas system",
    "universidade de sao paulo", "maastricht university"
]

# 著者 → 国 のリンク
author_to_country = dict(
    phillips_sm="canada",
    tipton_kd="usa",
    moore_dr="canada",
    vanloon_ljc="netherlands",
    candow_dg="canada"
)

# 国 → 大学 のリンク
country_to_uni = dict(
    canada="mcmaster university",
    usa="university of texas system",
    brazil="universidade de sao paulo",
    netherlands="maastricht university"
)

# ノード番号に変換
label_to_id = {label: i for i, label in enumerate(labels)}

print(label_to_id)
# サンキーのリンクを定義
sources = []
targets = []
values = []

# 著者 → 国
for author, country in author_to_country.items():
    sources.append(label_to_id[author.replace(" ", "_") if " " in author else author])
    targets.append(label_to_id[country])
    values.append(1)

# 国 → 大学
for country, uni in country_to_uni.items():
    sources.append(label_to_id[country])
    targets.append(label_to_id[uni])
    values.append(2)  # 研究者複数をまとめているので値を大きめに

# サンキー図を作成
fig = go.Figure(data=[go.Sankey(
    node=dict(
        pad=15,
        thickness=20,
        line=dict(color="black", width=0.5),
        label=labels
    ),
    link=dict(
        source=sources,
        target=targets,
        value=values
    )
)])

fig.update_layout(title_text="Author → Country → University Sankey Diagram", font_size=12)
fig.show()

plotlyを使えば, 簡単にサンキー図を作成することができた.

まとめ

今回は, サンキー図の作成方法を簡単にだがまとめた.
単語(キーワード)の関連性を可視化したこの図だが, 「見たことはあるけど, 名前はなんていうんだろう🧐」という方も多かったのではないだろうか(1敗)

ぜひサンキー図を駆使して, 魅力的な調査資料を作ってみよう!!

Discussion