概要
ggplot2でforループを使ったplot()的な複数プロットするときは、Rmisc::multiplot
が使える。
このとき、aesのデータフレーム引数には必ず列名を用いる。
列要素を直接指定すると、全て同一プロットになる場合があります。なんでそうなるかは分からん。
解説
例えば通常のplot()関数を使って、1枚に複数のグラフをプロットするには
par(mfrow = c(2,3))
for(i in 1:6){
data <- data.frame(1:10, rnorm(10))
plot(data, main = i)
}
ggplot2でも同じようにやりたい。
facet_grid,facet_wrap
を使うのが普通だと思うけど、1枚に系列全て収まらない場合、tidyr
やらのforループを入れることになって激しく面倒くさい。軸合わせもめんどいし。
もういいから最初からplot()のようにforループ使わせろ。
(だいぶ端折りましたすいません、それうまくできるよってツッコミがあれば是非教えて下さい)
こういうとき、Rmisc::multiplot
が使える。
multiplot自体は関数としてそのまま落っこちてる。
Multiple graphs on one page (ggplot2)
けど、CRANからRmisc落とすと入るのでそっちのほうがいいんじゃないかと。
install.packages("Rmisc")
library(Rmisc)
[Multiple plots in one page]
(http://rstudio-pubs-static.s3.amazonaws.com/2852_379274d7c5734f979e106dcf019ec46c.html)
上記ページを参考にして、
plots <- list() # new empty list
for (i in 1:6) {
p1 = qplot(1:10, rnorm(10), title = i)
plots[[i]] <- p1 # add each plot into plot list
}
multiplot(plotlist = plots, cols = 3)
ggplot()でも当然…
plots <- list()
for (i in 1:6) {
data <- data.frame(1:10, rnorm(10))
p1 = ggplot(data,aes(data[,1], data[,2])) +
geom_point() +
labs(title = i)
plots[[i]] <- p1
}
multiplot(plotlist = plots, cols = 3)
!??
ぜんぶおなじプロットになっとる。
死ぬほど悩んだが、p1 = ggplot(data,aes(data[,1], data[,2]))
が原因。どうやらggplotのaesにぶち込む引数は名前でちゃんと入れる必要があるみたい。
plots <- list()
for (i in 1:6) {
data <- data.frame(a = 1:10,b = rnorm(10))
p1 = ggplot(data,aes(a, b)) +
geom_point() +
labs(title = i)
plots[[i]] <- p1
}
multiplot(plotlist = plots, cols = 3)
そういえばggplot2の解説ではみんなデータフレームの名前で取り込んでたけど、これってマストなんですかね。
単品でプロットするときにはよく後から軸名をつけるなんてことをしてたけど、複数ではそういうことはできませんので前もって名前を付けましょう、というお話。