Другое решение, кроме уже упомянутых (с помощью 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)
В результате чего: