plot()を使って色々なグラフを簡単に描くことができるのはRの良いところです。しかし,積み重ねグラフを描くのは意外に手間取ります。ここではggplotのようなライブラリ(と専用コマンド)を使わないで,積み重ねグラフを描く方法を紹介します。魚種別漁獲量の経年変化を描くようなイメージです。
1列目にX変数,2列目以降に複数のY変数をもつデータを用意します。
一つ目の作図方法は,polygon()を使って,Y変数を減らしながら合計して多角形を塗りつぶします。
rowSums()を使ってfor()ループの中で合計していくため,第1列に値が全部0のダミー列Y0を加えているのが,ちょっと格好悪いのですが。
# ===== データを作る =====
# 1列目がX変数,2列目以降に複数のY変数が重なるデータ
x <- 2001:2010
y1 <- c(100,120,110, 90, 80, 70, 50, 60, 50, 30)
y2 <- c(60, 70, 80, 50, 70, 40, 30, 50, 20, 30)
y3 <- c(60, 20, 30, 10, 20, 5, 10, 4, 6, 3)
y4 <- c(50, 40, 50, 30, 40, 30, 10, 20, 10, 20)
y5 <- c(10, 20, 40, 30, 20, 50, 70, 50, 60, 70)
xyy <- data.frame(X=x, Y1=y1, Y2=y2, Y3=y3, Y4=y4, Y5=y5)
write.csv(xyy, "stackedXYY.csv", row.names=FALSE)
# データを読み込む
XYY <- read.csv("stackedXYY.csv")
# XとYを別のオブジェクトに分ける
X <- XYY$X
rownames(XYY) <- X
YY <- XYY[,-1]
# ===== polygon()を使った積み重ね面グラフ =====
Y0 <- numeric(length(X)) # 全部ゼロのダミーY
YY0 <- cbind(Y0, YY)
# 積み重ね集計をfor()文で最後まで回すためダミーYを1列目につける
X.s <- X[1]
X.e <- X[length(X)]
n.Y <- ncol(YY0) - 1
palette <- rev(terrain.colors(n.Y))
# 色は好きなように設定してください
# palette <- rev(rainbow(n.Y))
Y.total <- rowSums(YY0)
plot(Y.total ~ X, type = "n", ylab="Y", ylim = c(0, max(Y.total)*1.1))
for(i in 1:n.Y){
Y.subtotal <- rowSums(YY0[,1:(n.Y + 2 - i)])
polygon(c(X.s, X, X.e), c(0, Y.subtotal, 0), col = palette[i], lty=0)
lines(Y.subtotal ~ X, lwd=0.5) # 境界線を引きたければ
}
legend("topright", rev(colnames(YY)), col=palette[1:n.Y], pch=15)
2つ目の方法はbarplot()を使うもので,とても簡単にできます。
行列をt()で転置して使います。
# ===== barplot()を使った積み重ね棒グラフ =====
tYY <- as.matrix(t(YY))
barplot(tYY) # 白黒
barplot(tYY, col=terrain.colors(nrow(tYY)))
legend("topright", rev(colnames(YY)), col=palette[1:ncol(YY)], pch=15)
barplot(tYY, col=terrain.colors(nrow(tYY)), space=0) # 棒間隔ゼロ
barplot(tYY, col=terrain.colors(nrow(tYY)), space=0, border=F) # 輪郭線なし