gridExtra ライブラリを用いた出力
統計解析ソフトRにおいて、グラフを作成するために非常によく使われているライブラリとして ggplot2 というものがある。このライブラリで作った複数のグラフを1枚にまとめたければ、gridExtra ライブラリの grid.arrange という函数が使える。この函数を使うと、ggplot2 で作ったグラフを、格子状に並べることができる。
具体例を見てみよう。以下の例では、それぞれ別のデータから、棒グラフ (chart_1)、散布図 (chart_2)、箱ひげ図 (chart_4)、ヒストグラム (chart_4) という4つのグラフを作成している。そして、最後に、grid.arrange 函数を使って、まとめて1枚に出力している。grid.arrange 函数の引数としては、出力したいグラフを並べたのほかに、列の数を2列にするために ncol = 2 を指定している [1] 。
# ライブラリ読み込み library("ggplot2") library("gridExtra") # ggplot でグラフを4つ作成 chart_1 <- ggplot(data = mpg, aes(x = class)) + geom_bar() chart_2 <- ggplot(data = women, aes(x = height, y = weight)) + geom_point() chart_3 <- ggplot(data = diamonds, aes(x = color, y = carat)) + geom_boxplot() chart_4 <- ggplot(data = iris, aes(x = Petal.Length)) + geom_histogram(binwidth = 0.2) # まとめて1枚に出力 grid.arrange(chart_1, chart_2, chart_3, chart_4, ncol = 2) # 2列に並べる
上記の出力結果は以下のような図になる。
複雑なレイアウト
grid.arrange 函数の引数を変えれば、単純な格子状のレイアウトでなく、もう少し複雑なレイアウトにまとめることもできる。具体的には、レイアウトを行列の形で表し、その行列を grid.arrange 函数の layout_matrix で指定すれば良い。
具体例を2つ挙げる。まずは、1枚目のグラフを上段に、2枚目から4枚目のグラフを下段に並べるレイアウトで出力してみる。
# レイアウトを行列にし、layout1 に保存しておく layout1 <- rbind(c(1, 1, 1), c(2, 3, 4)) # まとめて1枚に出力 grid.arrange(chart_1, chart_2, chart_3, chart_4, layout_matrix = layout1)
上記の出力結果は以下の図のようになる。
次に、3枚目のグラフが左側、2枚目のグラフが右上、1枚目のグラフと4枚目のグラフが右下に来るようなレイアウトで出力してみる。
# レイアウトを行列にし、layout2 に保存しておく layout2 <- rbind(c(3, 2, 2), c(3, 1, 4)) # まとめて1枚に出力 grid.arrange(chart_1, chart_2, chart_3, chart_4, layout_matrix = layout2)
上記の出力結果は以下の図のようになる。
このような複雑なレイアウトで出力する方法については、英語の記事だが、Arranging multiple grobs on a page にさらに詳しい情報がある。
補足
なお、1つのデータフレームをもとに作るグラフで、そのデータフレームの中の何らかのものを基準として描く場合は、ggplot2 ライブラリに含まれている facet_grid 函数や facet_wrap 函数を使った方が楽だ。例えば、以下では、carat と price の散布図を color ごとに分けてグラフにしたものをまとめて出力している。
ggplot(data = diamonds, aes(x = carat, y = price)) + geom_point() + facet_grid(. ~ color)
上記の出力結果は以下の図のようになる。
color ごとに散布図が分けて出力されていることが分かるだろう。まったく関係のないデータから作られた別々のグラフならば、gridExtra ライブラリを使わざるをえないが、同じデータから似たようなものをグループ分けして出力する場合は、このように facet_grid 函数や facet_wrap 函数で十分なのだ。
- 列の数でなく、行の数を指定したければ、ncol の代わりに、nrow とすれば良い。 [↩]