ggplot2 ライブラリで作った複数のグラフを1枚にまとめるには、gridExtra ライブラリが使える

概要
統計解析ソフトRにおけるグラフ作成用ライブラリ ggplot2 で作った複数のグラフを格子状に並べて1枚にするには、gridExtra ライブラリの grid.arrange という函数が使える。

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 函数を使って、4つのグラフを格子状に並べた例。
grid.arrange 函数を使って、4つのグラフを格子状に並べた例。

複雑なレイアウト

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)

上記の出力結果は以下の図のようになる。

grid.arrange 函数を使って、1枚目が上段に、残りの3枚が下段に来るように、4つのグラフをまとめた例。
grid.arrange 函数を使って、1枚目が上段に、残りの3枚が下段に来るように、4つのグラフをまとめた例。

次に、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)

上記の出力結果は以下の図のようになる。

grid.arrange 函数を使って、3枚目のグラフが左側、2枚目のグラフが右上、1枚目のグラフと4枚目のグラフが右下に来るようように、4つのグラフをまとめた例。
grid.arrange 函数を使って、3枚目のグラフが左側、2枚目のグラフが右上、1枚目のグラフと4枚目のグラフが右下に来るようように、4つのグラフをまとめた例。

このような複雑なレイアウトで出力する方法については、英語の記事だが、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)

上記の出力結果は以下の図のようになる。

facet_grid 函数で複数のグラフを並べて出力した例。
facet_grid 函数で複数のグラフを並べて出力した例。

color ごとに散布図が分けて出力されていることが分かるだろう。まったく関係のないデータから作られた別々のグラフならば、gridExtra ライブラリを使わざるをえないが、同じデータから似たようなものをグループ分けして出力する場合は、このように facet_grid 函数や facet_wrap 函数で十分なのだ。

脚注
  1. 列の数でなく、行の数を指定したければ、ncol の代わりに、nrow とすれば良い。 []