Ще одне рішення, окрім вже згадуваних судин (за допомогою 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)
Результат: