Rでデータ分析をした後、視覚的なツールとしてグラフを作成しますね。
通常はグラフは1つ1つ表示されますが、複数のグラフを比較した時は
各グラフWindowをデスクトップ上に並べたいですね。
今回は、複数のグラフを表示させる方法を2つ紹介します。
- 複数のグラフWindowを表示させる方法
- 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) という形式で指定します。
上の例のグラフは
- 最初にfig= で、x軸に 0 から 0.8 まで、y軸に 0 から 0.8 までの範囲で散布図を配置します。
- そして、上の箱ひげ図は、x軸が0~0.8、y軸が0.45~1で設定
- 右側の箱ひげ図は x 軸が 0.55 ~ 1、y 軸が 0 ~0.8 までに設定
- さらに、新しい図を既存のグラフに図を追加するときは 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などをまとめてみました。グラフの比較はデータ解析の第一段階として重要ですね。またまとめたデータをプレゼンテーションする時も、見やすく・分かりやすいグラフは不可欠ですね。
コメント