PR

R初心者でも簡単!複数のグラフを表示・結合する方法:par, layout, mfrow, mfcol

結合 R programming
記事内に広告が含まれています。


Rでデータ分析をした後、視覚的なツールとしてグラフを作成しますね。
通常はグラフは1つ1つ表示されますが、複数のグラフを比較した時は
各グラフWindowをデスクトップ上に並べたいですね。

今回は、複数のグラフを表示させる方法を2つ紹介します。

  1. 複数のグラフWindowを表示させる方法
  2. 1つのグラフWindowに複数のグラフを表示させる方法

どちらも簡単で、データ分析には便利ですので、ぜひ試してみてください。

複数のグラフWindowを表示させる方法

複数のグラフを作成して、自由にグラフにアクセスできるようにするにはdev.new()関数を使います。

最初にdev.new()を実行することで、新しいグラフWindowを開くことができます。

例えば、

dev.new()
グラフ1
dev.new()
グラフ2
・・・・といった感じです。

試しに以下のスクリプトを実行して見て下さい。

dev.new()
plot(mtcars$wt,mtcars$mpg, main="Scatterplot of wt vs. mpg")
dev.new()
plot(mtcars$wt,mtcars$disp, main="Scatterplot of wt vs disp")
dev.new()
hist(mtcars$wt, main="Histogram of wt")
dev.new()
boxplot(mtcars$wt, main="Boxplot of wt")

すると、以下のように複数のグラフWindowを出すことができますよ!


上の様に複数のグラフWindowを並べればデータ比較が容易になりますね。

1つのグラフWindowに複数のグラフを表示させる方法

R では、par() または layout() 関数を使用して、複数のグラフを 1 つのグラフにまとめることが簡単にできます。

par()関数で複数のグラフを結合させる
par()関数の引数として

  • mfrow=c(nrows, ncols) :横並びにnrows x ncols のグラフが作成されます。
  • mfcol=c(nrows, ncols): 縦並びにnrows x ncols のグラフが作成されます。

たとえば、下のスクリプトを実行すると4つのプロットを作成し、横並びに2×2で1つのグラフができます。

par(mfrow = c(2, 2))
plot(mtcars$wt,mtcars$mpg, main="Scatterplot of wt vs. mpg")
plot(mtcars$wt,mtcars$disp, main="Scatterplot of wt vs disp")
hist(mtcars$wt, main="Histogram of wt")
boxplot(mtcars$wt, main="Boxplot of wt")


下の図が横並びに結合された4つのグラフです。


また、同じ4つのグラフで、par()内をmfcolとすれば、縦並びに2×2にグラフが結合されます。

par(mfcol = c(2, 2))
plot(mtcars$wt,mtcars$mpg, main="Scatterplot of wt vs. mpg")
plot(mtcars$wt,mtcars$disp, main="Scatterplot of wt vs disp")
hist(mtcars$wt, main="Histogram of wt")
boxplot(mtcars$wt, main="Boxplot of wt")


縦並びの4つのグラフが表示されましたね。


また、ヒストグラムなどは縦に並べると比較しやすいですよ。

par(mfcol = c(3, 1))
hist(mtcars$mpg,main ="Histogram of mpg")
hist(mtcars$disp, main="Histogram of disp")
hist(mtcars$wt, main="Histogram of wt")

layout()関数を使って複数のグラフを結合

layout() 関数は

layout(mat, widths = rep.int(1, ncol(mat)), heights = rep.int(1, nrow(mat)), respect = FALSE)

という形式で、mat は結合するグラフの場所を指定します。

例えば、以下のようにグラフを1列目に1つ、2列目に3つのグラフを配置したいとすれば、

layout(matrix(c(
1, 1, 1,
2, 3, 4,
2, 3, 4), nr=3, byrow=T))

のようになります。
行列の部分を上のレイアウト図と同じように並べてみました。
3×3の行列で、
・1行目の1~3列に1番目の画像
・2/3行目の1列目に2番目の画像
・2/3行目の2列目に3番目の画像
・2/3行目の3列めに4番目の画像
が配置されます。視覚的にイメージできましたか?

実際に、par()関数で使った4つのグラフを上の配列で並べてみます。

layout(matrix(c(
1, 1, 1,
2, 3, 4,
2, 3, 4), nrow=3, byrow=T))
plot(mtcars$wt,mtcars$mpg, main="Scatterplot of wt vs. mpg")
plot(mtcars$wt,mtcars$disp, main="Scatterplot of wt vs disp")
hist(mtcars$wt, main="Histogram of wt")
boxplot(mtcars$wt, main="Boxplot of wt")


さらにオプションとして、layout()関数に widths= と heights= を含めると、各図の大きさをより正確に制御できます。

1ランクアップの配置で詳細な図を作成

さらに詳細な情報を表した以下のような図も作ることができます。


この図を作成するには図の配置を設定する必要があります。

この時使用するのが、par()関数の引数、fig=です。

このグラフがどのように作られたかを理解するには、グラフの全領域を左下の(0,0)から右上の(1,1)までと考えます。そして、fig= で範囲を、c(x1, x2, y1, y2) という形式で指定します。

par(fig =c(x1,x2,y1,y2))


上の例のグラフは

  1. 最初にfig= で、x軸に 0 から 0.8 まで、y軸に 0 から 0.8 までの範囲で散布図を配置します。
  2. そして、上の箱ひげ図は、x軸が0~0.8、y軸が0.45~1で設定
  3. 右側の箱ひげ図は x 軸が 0.55 ~ 1、y 軸が 0 ~0.8 までに設定
  4. さらに、新しい図を既存のグラフに図を追加するときは new=TRUE オプションを含めます。

ちなみに、0.8ではなく0.45や0.55を選んだのは、追加した図と散布図のバランスをとるためです。(※注意:追加する図に必要なスペースは、デバイスに依存することがあります。Error in plot.new(): figure margins too large" と表示されたら、各グラフに与えられる面積の配分を変えてみてください。

par(fig=c(0, 0.8, 0, 0.8))
plot(mtcars$wt, mtcars$mpg, xlab="Miles Per Gallon", ylab="Car Weight")
#上の箱ひげ図
par(fig=c(0, 0.8, 0.45, 1), new=TRUE)
boxplot(mtcars$wt, horizontal=TRUE, axes=FALSE)
#右の箱ひげ図
par(fig=c(0.55, 1, 0, 0.8), new=TRUE)
boxplot(mtcars$mpg, axes=FALSE)

まとめ

Rで複数のグラフを表示、結合させるためのdev.new,par, layout, mfrow, mfcolなどをまとめてみました。グラフの比較はデータ解析の第一段階として重要ですね。またまとめたデータをプレゼンテーションする時も、見やすく・分かりやすいグラフは不可欠ですね。

コメント