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