このエントリは計算機統計学会第30回シンポジウムにおける兼田麻里奈、坂本亘両氏のご発表「ラザニアプロットを用いた経時データの視覚化」にインスパイアされたものです。
時系列データを表現するのによく用いられるのは折れ線グラフですが、複数の系列を同時にプロットした場合、線が重なり見づらくなります。
Swihart et al. (2010) ではごちゃごちゃした折れ線グラフを「スパゲティープロット」と呼び、代替案としてヒートマップを用いた表現を推奨しているとのことです。
下図はスパゲティープロットの例です。
#R のコード set.seed(1) mat1 <-matrix(round(rnorm(4*10),2),4,10)#適当なデータを生成 matplot(t(mat1),type ="l")
これに対してラザニアプロットは以下のような図です。
#凡例のあるラザニアプロットを描く関数を定義 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)
統計グラフの色については 統計グラフの色が参考になります。
"real G's move in silence like lasagna"というラインは有名。