R を使ったサンキーダイアグラムの作り方: NetworkD3 パッケージ
UB3/informatics/r/sankey
このページの最終更新日: 2025/01/05- 概要: サンキーダイアグラムとは
- R の sankeyNetwork() 関数
- sankeyNetwork() で色をつける
- sankeyNetwork() で順番を変える
- sankeyNetwork() で html ファイルを出力する
広告
概要: サンキーダイアグラムとは
サンキーダイアグラム Sankey diagram とは、各工程間の流量を示す以下のような図のことである (2)。Sankey にちなんでこのように呼ばれるが、それ以前にも類似の表現方法はあったようである。
1898 年、アイルランドの Sankey が蒸気機関の熱効率を示すのに使ったオリジナルの Sankey diagram (Public domain)。
このページでは、R の networkD3 パッケージに含まれる sanketNetwork 関数でサンキーダイアグラムを作る方法をまとめる。以下のような図ができる (このページの下の方 にスクリプトがあります)。サンキーダイアグラムは ggplot でも作ることができ、その方法は ggsankey 関数を使ったサンキーダイアグラム作成 のページにまとめた。

R の sankeyNetwork() 関数
R でサンキーダイアグラムの作成に最も使われている関数は、networkD3 というパッケージに含まれる sankeyNetwork だろう。
まずは、このページ を参考にシンプルなスクリプトを。
これを実行すると、ページの上の方で示した図が出力される。png と html で出力され、pdf は方法がわからない。

インプットデータ links
上記 script の最後の部分を見るとわかるように、メインとなる input は links という変数である。これは以下のような中身をしている。結構単純に、線の出発点となる source、標的の target および線の太さを指定する value があるだけである。source と target の ID は、# With networkD3, connection must be provided using id, not using real name like in the links の部分で自動で追加される。
なお、この IDsource と IDtarget は numeric であり、文字列になっていると結果が出力されない。str(links) などで確認できる。

- 上の例では value は整数だが、少数が入っても問題ない。
- value = 0 でも線は消えず、非常に細い線が引かれる。
- マイナスの値はゼロ扱いになってしまい、細い線になる。
node という変数はさらにシンプルで、node の名前が書いてあるだけである。

sankeyNetwork() のオプション
自分が使ったことのあるもののみ。詳細は R Documentation を参照のこと。
Links |
上記の インプットデータ の部分で示したような links を指定する。 |
Nodes |
上記の インプットデータ の部分で示したような nodes を指定する。 |
fontSize |
fontSize = 10 のようにフォントサイズを指定。 |
iterations |
それぞれの node の y 軸上の位置を計算する回数。ブラウザで計算されるので、高い数を設定しないこと。iterations = 0 を指定すると、nodes autopositioning をオフにでき、入力順に並ぶようになる (参考)。 |
colourScale |
色をつけるときに指定。使い方は、このページの下にある sankeyNetwork() で色をつける に。 |
LinkGroup |
リンク (線の部分) 色をつけるときに使用。 |
NodeGroup |
ノードに色をつけるときに使用。 |
nodeWidth |
ノードの太さ。nodeWidth = 1 のように数字で指定。0 で node が完全に見えなくなる。 |
width |
図全体の幅、高さを指定。 |

sankeyNetwork() で色をつける
sankeyNetwork() 関数で link および node の色を指定したい場合、付け足すのは原則として以下の情報である。
つまり、links および node に色を指定する列を追加することになる。links は以下のようなデータになる。

同様に node にも group という列が追加され、そこに blue というグループ名が入る。

my_color の部分は、pink や blue というグループ名と、実際の色をマッチさせている。links や nodes の group 列は単に名前なので、色でなく A とか B でもよい。その場合の script は以下。
最後に、Sankey を作るところで color とグループを指定する。

全体のスクリプトは以下のようになる。
sankeyNetwork() で順番を変える
順番を変えるときは、まず nodes で順番を変え、次に links に ID をつける。さらに iteration を 0 にする。
たとえば、group A と group B をひっくり返したい場合には、まず nodes を変更する。
これで、iterations = 0 を設定すれば OK。全体の script は以下。ID を振る前に nodes の順を変更しないと、ボックスの位置は変わらず、nodes の名前の表示だけが変わるので間違った図になってしまう。注意。

sankeyNetwork() で html ファイルを出力する
savenetwork() 関数を使う。
paste() 関数を用いる。
selfcontained を TRUE にすると、結果が全ての情報を含んだ一つの html ファイルとして出力される。FALSE の場合、html ファイルと同じ階層にフォルダができ、そこに含まれるデータを参照する形になる。通常は TRUE を選ぶだろう。
広告
References
- Customize colors in Sankey Diagram. Link: Last access 2023/04/22.
コメント欄
サーバー移転のため、コメント欄は一時閉鎖中です。サイドバーから「管理人への質問」へどうぞ。