エネルギーの流れを理解するためには,サンキー・ダイアグラム(Sankey diagram)という図表を用いると良い。サンキー・ダイアグラムというのはフロー図の一種で,工程間のエネルギー・物資・資金等の流量を表現するのに用いられる。
小生が関わっている分野で言うと,環境工学やエネルギー関連の研究で良く用いられる。
サンキー・ダイアグラムはわかりやすい図表だが,作るのは大変である。
何か良い手はないかと思ったら,Rにちょうどいいパッケージがあった。
"riverplot"
というパッケージがそれである。実は"sankey"というそのものズバリのパッケージもあるのだが,riverplotの方が,説明がわかりやすく,出力される図もきれいだったので,こちらを使ってみる。
◆ ◆ ◆
準備
まず,何としてもパッケージriverplotを入手する。
CRANにあるはずなので,探してみること。
◆ ◆ ◆
riverplotの練習 (1)
A, B, Cという3つのノードがあり,AからCに5,BからCに10が流れるとする。
これをriverplotでフロー図(サンキー・ダイアグラム)にしてみよう。
まず,なにも考えずに,以下のコマンドを打ち込んでいく。
最後に"Enter"キーを押して,次のような図が出てきたらOK。
◆ ◆ ◆
nodesの説明
さて,コマンドの解説を始める。
どんなフロー図を書くのか,という定義はmakeRiver()という関数を用いて行う。
makeRiver()には最低限,nodesとedgesという2つの変数が必要である。
nodesというのはノード,つまり結束点を定義したデータフレームである。
今回はA, B, Cという3つのノードがある。それぞれのID(識別コード),横軸(x)座標,色(col),名前(labels)を次のように決めよう:
- ノードA:IDを"A",横軸(x)座標を1とする。色(col)を黄色とし,名前(labels)を"Node A"とする。
- ノードB:IDを"B",横軸(x)座標を1とする。色(col)をデフォルトの灰色とし,名前(labels)を"Node B"とする。
- ノードC:IDを"C",横軸(x)座標を2とする。色(col)をデフォルトの灰色とし,名前(labels)を"Node C"とする。
ノードごとにIDやx座標を定義するのではなく,ID,x座標といった属性ごとに定義を行うことにする。
すると,
ID = c("A", "B", "C")
x= c( 1, 1, 2 )
col= c( "yellow", NA, NA )
labels= c( "Node A", "Node B", "Node C" )
となる。色(col)に関しては,NAと書いておけば,デフォルトの灰色が指定される。
これら4つの属性をnodesに収納するため,data.frame関数を使用する:
nodes <- data.frame( ID = c("A", "B", "C"),
x= c( 1, 1, 2 ),
col= c( "yellow", NA, NA ),
labels= c( "Node A", "Node B", "Node C" ),
stringsAsFactors= FALSE )
最後に
stringsAsFactors= FALSE
というのがあるが,今回はこれを「まじない」とでも言っておく。
これで,ノードに関する定義が終わった。
edgesの説明
つぎに,edgesという変数の説明。
edgesというのはノード間の流れを定義したデータフレームである。
今回の例では,AからCに5,BからCに10の何か(水かもしれないし,金かもしれない)が流れるという設定である。
edgesというデータフレームでは,流れの出発点をN1と呼び,流れの終着点をN2と呼ぶ。N1からN2への流量をValueと呼ぶ。
すると,
- AからCに流量5の流れがあることを:N1 = "A", N2 = "C", Value = 5
- BからCに流量10の流れがあることを:N1 = "B", N2 = "C", Value = 10
と表すことになる。
流れごとにN1, N2, Valueを定義するのではなく,N1, N2, Valueといった属性ごとに定義を行うことにする。
すると,
N1 = c("A", "B")
N2 = c("C", "C")
Value = c(5, 10)
となる。これら3つの属性をedgesに収納するため,data.frame関数を使用する:
edges <- data.frame( N1 = c("A", "B"),
N2 = c("C", "C"),
Value = c(5, 10))
これで,ノード間の流れを定義できた。
nodesとedgesの定義が終わったので,makeRiver()関数を使って,全体の流れの情報をrという変数に代入する:
r <- makeRiver( nodes, edges )
これで,あとは
plot( r )
と打ち込めば,フロー図が出力される。