除了已经提到的ondes(使用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)
导致: