Rの積み重ねグラフ

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)    # 輪郭線なし