除了前面提到的方法(使用layout或par(xpd=TRUE))之外,另一个解决方案是在整个设备上覆盖一个透明的plot,然后添加图例。
诀窍是将一个(空的)图形覆盖在完整的绘图区域上,并将图例添加到该区域。我们可以使用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)
导致: