Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
9
Help us understand the problem. What is going on with this article?
@sazya

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

More than 5 years have passed since last update.

概要

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

9
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
sazya

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
9
Help us understand the problem. What is going on with this article?