Другое решение, кроме уже упомянутых (с использованием 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)
В результате:
![Example figure shown legend in top margin](https://i.stack.imgur.com/YbFS3.png)