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.off
dev.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
は使ったことはありません。