可視化の殿堂:サンキー図📈
概要
最近, レビュー論文を読んでいるときに度々見かける図がある.
それは以下の図のように, キーワード間を波のような線で繋いだチャートである.
このような図を、サンキー図というらしい.
筆者自身, 情報の可視化を考えたときに,このようなサンキー図を書きたいと思い, 可視化ツールや簡単なサンプルをまとめておくことにした.
本編
サンキー図とは
まずサンキー図とはそもそも何か? 説明しておく.
Wikipediaによると,
サンキー・ダイアグラム(英語: Sankey diagram)は工程間の流量を表現する図表である。矢印の太さで流れの量を表している。特にエネルギーや物資、経費等の変位を表す為に使われる。 Sankeyの名前の由来は1898年に初めてこの形式の表を用いた公刊物(Minutes of Proceedings of The Institution of Civil Engineers中の蒸気機関におけるエネルギー効率についての記事)の著者であるアイルランド人ヘンリー・フィニアス・リオル・サンキーに因む。
とのことで, 驚くことに, キーワードの可視化のための図ではない, 全く違った分野に由来をもつ.
可視化ツール
誰かが このサンキー図をキーワード間の関係性を図示する, のに適していると判断した.
そして, サンキー図を作成するための可視化ツールも複数用意されている.
プログラミング系
- Python
- R
- ggalluvial(ggplot2拡張)
- networkD3::sankeyNetwork
- JavaScript
- D3.js(サンキー図ライブラリあり)
D3 での実装はこちらから
専用ソフトウェア系
- Tableau(カスタムでサンキー図可視化可能)
- RAWGraphs(Webベース、Sankey/Alluvial対応)
- Gephi(ネットワーク可視化全般、プラグインでサンキー風可)
ブラウザ系
データを手作業で入力するという手間は発生するが, プログラミングなしでサンキー図を作成できるサイトも存在する.
上記も参考に
事例
練習として, plotlyでの実装例をあげておく.事前に plotly
のインストールをしておこう.
pip install plotly
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