1par(mfcol = c(2,2))
2plot(1, 1, pch = "1")
plot(1, 1, pch = "2")
plot(1, 1, pch = "3")
plot(1, 1, pch = "4")- 1
- 2行2列のプロットを列から作成します
- 2
- 4つのプロットを作成します

November 1, 2024
Rではデフォルトではに1回のプロットで1つのグラフしか作れませんが、設定を変更することで複数のプロットを並べることができます。 やり方は3通りあります。
par(mfrow)かpar(mfcol)を設定するlayout関数で設定するsplot.screenで設定するそれぞれについてまとめていきます。
parの使用parはグラフィックパラメータの指定に使います。 つまり、parametersの略ということになります。 par(mfcol= c(行数, 列数))もしくはpar(mfrow= c(行数, 列数))とすることで、何個のプロットをどのように配置するかを決めることができます。
mfcolは列から、mfrowは行からプロットを作成します。 まずはmfcolから挙動を確認してみます。
1par(mfcol = c(2,2))
2plot(1, 1, pch = "1")
plot(1, 1, pch = "2")
plot(1, 1, pch = "3")
plot(1, 1, pch = "4")
次にmfrowを確認してみます。
1par(mfrow = c(2,2))
2plot(1, 1, pch = "1")
plot(1, 1, pch = "2")
plot(1, 1, pch = "3")
plot(1, 1, pch = "4")
parで指定したパラメータはデバイスが閉じられるまで永続します。プロットのあとにdev.offもしくは変更前のparを保存しておいてあとから戻すことでリセットできます。
設定を戻さずプロットを重ねた場合はparの設定が引き継がれます。
par(mfrow = c(2,2))
plot(1, 1, pch = "1")
plot(1, 1, pch = "2")
plot(1, 1, pch = "3")
plot(1, 1, pch = "4")

5個目のプロットが左上に表示されていることがわかります。
dev.offdev.offはデバイス(プロット)を終了させる関数です。
par(mfrow = c(2,2))
plot(1, 1, pch = "1")
plot(1, 1, pch = "2")
plot(1, 1, pch = "3")
plot(1, 1, pch = "4")
null device
1
一度dev.offを挟むことにより、1つのプロットだけがプロット領域全体に表示されるようになります。
parを使ってもとに戻す次は、変更前のparを変数に入れておき、あとからもとに戻す方法です。
old_par <- par()
par(mfrow = c(2,2))
plot(1, 1, pch = "1")
plot(1, 1, pch = "2")
plot(1, 1, pch = "3")
plot(1, 1, pch = "4")
Warning in par(old_par): graphical parameter "cin" cannot be set
Warning in par(old_par): graphical parameter "cra" cannot be set
Warning in par(old_par): graphical parameter "csi" cannot be set
Warning in par(old_par): graphical parameter "cxy" cannot be set
Warning in par(old_par): graphical parameter "din" cannot be set
Warning in par(old_par): graphical parameter "page" cannot be set

old_parに一度parを保存し、あとからそれで上書きしています。 警告が表示されることがありますが、多くの場合は問題ありません。 複数のグラフィックパラメータを変更した際などに役に立ちます。
layout関数の使用layout関数はプロット領域を柔軟に割り当てることができる関数です。 layout(行列)と指定することで、引数の行列の通りプロットを割り当て、行列の数字の順番にプロットします。
まずはレイアウトに用いる行列を作成してみます。
2行2列で列から数字が割り振られています。
次にlayout関数でこの行列のとおりにプロットします。
layout(layout_matrix)
plot(1, 1, pch = "1")
plot(1, 1, pch = "2")
plot(1, 1, pch = "4")
plot(1, 1, pch = "3")
ちなみに、行からプロットを埋めたい場合には、matrix関数の引数にbyrow = TRUEを指定します。
[,1] [,2]
[1,] 1 2
[2,] 3 4
layout(layout_matrix)
plot(1, 1, pch = "1")
plot(1, 1, pch = "2")
plot(1, 1, pch = "3")
plot(1, 1, pch = "4")
layout関数の便利な点は、行列内の任意の場所にプロットを割り当てられることです。 作成したい領域のとおりに行列の数字を割り振ります。 ここでは2行2列で、1列目に1を2つ並べ、2列目に2, 3と割り当てます。
3つのプロットを並べてみます。
行列の数字のとおり、1列目に2スペース分を使用して縦長のプロットを作成することができました。
このように、柔軟かつわかりやすくプロット領域を作成できるのがlayout関数の強みと言えます。
layoutの場合、元に戻すにはlayout(1)とします。 これは、1行1列の行列を指定しており、つまりプロット領域に1つのプロットを配置することになります。
split.screenの使用こちらは挙動が少しややこしいです。 具体例で確認してみます。
1split.screen(c(2, 1))
2split.screen(c(1, 3), screen = 2)
3screen(1)
plot(1, 1, pch = "1")
4screen(4)
plot(1, 1, pch = "4")screen = 1, 下がscreen = 2になります
screen = 2を1行3列に3分割します。左側からそれぞれscreen = 3, 4, 5と当てはめられます
screen = 1にプロットを作成します
screen = 4にプロットを作成します。このとき、2行目のプロット領域は左から3, 4, 5と番号が振られていることに注意します

[1] 1 2
[1] 3 4 5
ちなみにこのときにscreen(2)と指定すると、split.screen(c(1, 3), screen = 2)が無視され、2行1列のプロットが作成されます。
split.screen(c(2, 1))
split.screen(c(1, 3), screen = 2)
screen(1)
plot(1, 1, pch = "1")
1screen(2)
plot(1, 1, pch = "2")
[1] 6 7
[1] 8 9 10
つまり、split.screenを使用するとスクリーンが上書きされるということがわかります。
コードの書きやすさ、わかりやすさはpar > layout > split.screenだと思いますが、柔軟性はその逆であるように思います。
個人的には、サクッと複数のグラフを並べたいときはpar、あるグラフを大きくしたいときはlayoutのように使い分けている気がします。最近はlayoutをよく使っています。 実はsplit.screenは使ったことはありません。