« また,宇部市万倉の古民家レストラン「倉」でランチを食べてきたわけで | トップページ | 明日からネパールへ »

2017.03.21

Rでサンキ―・ダイアグラム的なものを書く

エネルギーの流れを理解するためには,サンキー・ダイアグラム(Sankey diagram)という図表を用いると良い。サンキー・ダイアグラムというのはフロー図の一種で,工程間のエネルギー・物資・資金等の流量を表現するのに用いられる。

小生が関わっている分野で言うと,環境工学やエネルギー関連の研究で良く用いられる。

サンキー・ダイアグラムはわかりやすい図表だが,作るのは大変である。

何か良い手はないかと思ったら,Rにちょうどいいパッケージがあった。

"riverplot"

というパッケージがそれである。実は"sankey"というそのものズバリのパッケージもあるのだが,riverplotの方が,説明がわかりやすく,出力される図もきれいだったので,こちらを使ってみる。


◆   ◆   ◆


準備

まず,何としてもパッケージriverplotを入手する。

CRANにあるはずなので,探してみること。


◆   ◆   ◆


riverplotの練習 (1)

A, B, Cという3つのノードがあり,AからCに5,BからCに10が流れるとする。

これをriverplotでフロー図(サンキー・ダイアグラム)にしてみよう。

まず,なにも考えずに,以下のコマンドを打ち込んでいく。

最後に"Enter"キーを押して,次のような図が出てきたらOK。

Riverplot01_2


◆   ◆   ◆


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 )

と打ち込めば,フロー図が出力される。

|

« また,宇部市万倉の古民家レストラン「倉」でランチを食べてきたわけで | トップページ | 明日からネパールへ »

R」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/44485/65045547

この記事へのトラックバック一覧です: Rでサンキ―・ダイアグラム的なものを書く:

« また,宇部市万倉の古民家レストラン「倉」でランチを食べてきたわけで | トップページ | 明日からネパールへ »