読者です 読者をやめる 読者になる 読者になる

廿TT

譬如水怙牛過窓櫺 頭角四蹄都過了 因甚麼尾巴過不得

ラザニアプロット(fields パッケージの image.plot にちょっと一工夫)

R グラフ

このエントリは計算機統計学会第30回シンポジウムにおける兼田麻里奈、坂本亘両氏のご発表「ラザニアプロットを用いた経時データの視覚化」にインスパイアされたものです。

時系列データを表現するのによく用いられるのは折れ線グラフですが、複数の系列を同時にプロットした場合、線が重なり見づらくなります。

Swihart et al. (2010) ではごちゃごちゃした折れ線グラフを「スパゲティープロット」と呼び、代替案としてヒートマップを用いた表現を推奨しているとのことです。

下図はスパゲティープロットの例です。

f:id:abrahamcow:20161125234458p:plain

#R のコード
set.seed(1)
mat1 <-matrix(round(rnorm(4*10),2),4,10) #適当なデータを生成
matplot(t(mat1),type = "l")

これに対してラザニアプロットは以下のような図です。

f:id:abrahamcow:20161125231450p:plain

#凡例のあるラザニアプロットを描く関数を定義
lasagna.leg <- function(X, col=palette, axes=F, ...){
  fields::image.plot(t(X)[,(nrow(X):1)], col=col, axes=axes, ... )
  box()
}

colnames(mat1) <- 2004:2013 #列ラベルをつける
rownames(mat1) <- LETTERS[1:4] #行ラベルをつける
palette <- rev(heat.colors(12)) #順序を入れ替える

#行列の要素を重ね書きする関数を定義
lasagna.lab <- function(mat1, ...){
  mat2 <- t(apply(mat1,2,rev))
  text(expand.grid(seq(0,1,length=nrow(mat2)),seq(0,1,length=ncol(mat2))),
       labels=c(mat2), ...)
  
}

#軸をつける関数を定義
lasagna.axis <- function(mat1){
  axis(side=1,at=seq(0,1,length=ncol(mat1)),labels=colnames(mat1))
  axis(side=2,at=seq(1,0,length=nrow(mat1)),labels=rownames(mat1),las=TRUE,cex.axis=0.8)
}

lasagna.leg(mat1, col=palette,axes = FALSE)
lasagna.lab(mat1)
lasagna.axis(mat1)

lasagna.leg 関数は Swihart et al. (2010; https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2937254/) の付録で公開されているものです(lasagna.lab と lasagna.axis はぼくが書きました)。

image.plot は左下が行列の (1,1) 成分、その右隣が (2,1) 成分……という順番で対応しているため, lasagna.leg では行の上下を順番に入れ替えて転置をとっています。

heat.colors(12) はデフォルトでは大きい数字が薄い色、小さい数字が濃い色で表現されるため rev で順番を反転させて palette にしています。

個人的には heat.colors の色使いは原色が強すぎる気がしていて適当なカラーパレットを colorRampPalette で定義してやるのがおすすめです。

cols_blue = colorRampPalette(c("white","cornflowerblue"))
lasagna.leg(mat1,col = cols_blue(12))
lasagna.lab(mat1)
lasagna.axis(mat1)

f:id:abrahamcow:20161125233258p:plain

統計グラフの色については 統計グラフの色 が参考になります。


"real G's move in silence like lasagna" というラインは有名。

abrahamcow.hatenablog.com

abrahamcow.hatenablog.com