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