別の解決策として、すでに述べたオンデス(layout
またはを使用par(xpd=TRUE)
)のほかに、デバイス全体の透明なプロットでプロットをオーバーレイし、それに凡例を追加する方法があります。
トリックは、完全なプロット領域に(空の)グラフをオーバーレイし、それに凡例を追加することです。par(fig=...)
オプションを使用できます。まず、Rにプロットデバイス全体に新しいプロットを作成するように指示します。
par(fig=c(0, 1, 0, 1), oma=c(0, 0, 0, 0), mar=c(0, 0, 0, 0), new=TRUE)
プロットの内部がデバイス全体をカバーするようにしたいので、設定oma
およびmar
必要です。new=TRUE
Rが新しいデバイスを起動しないようにするために必要です。次に、空のプロットを追加できます。
plot(0, 0, type='n', bty='n', xaxt='n', yaxt='n')
そして、凡例を追加する準備が整いました:
legend("bottomright", ...)
デバイスの右下に凡例を追加します。同様に、凡例を上または右マージンに追加できます。確認する必要がある唯一のことは、元のプロットのマージンが凡例を収容するのに十分な大きさであることです。
これらすべてを関数に入れます。
add_legend <- function(...) {
opar <- par(fig=c(0, 1, 0, 1), oma=c(0, 0, 0, 0),
mar=c(0, 0, 0, 0), new=TRUE)
on.exit(par(opar))
plot(0, 0, type='n', bty='n', xaxt='n', yaxt='n')
legend(...)
}
そして例。最初に、凡例を追加するために下部に十分なスペースがあることを確認して、プロットを作成します。
par(mar = c(5, 4, 1.4, 0.2))
plot(rnorm(50), rnorm(50), col=c("steelblue", "indianred"), pch=20)
次に、凡例を追加します
add_legend("topright", legend=c("Foo", "Bar"), pch=20,
col=c("steelblue", "indianred"),
horiz=TRUE, bty='n', cex=0.8)
その結果: