LoginSignup
10
9

More than 5 years have passed since last update.

ggplot2でplot()的な複数グラフ表示とその闇

Last updated at Posted at 2016-03-14

概要

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)
    }

とすればok。
Rplot09.png

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
上記ページを参考にして、

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)

うん、できた。
Rplot08.png

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)

Rplot07.png

!??
ぜんぶおなじプロットになっとる。

死ぬほど悩んだが、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)

Rplot06.png

そういえばggplot2の解説ではみんなデータフレームの名前で取り込んでたけど、これってマストなんですかね。
単品でプロットするときにはよく後から軸名をつけるなんてことをしてたけど、複数ではそういうことはできませんので前もって名前を付けましょう、というお話。

10
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9