Otra solución, además de las ondes ya mencionadas (usando layout
o par(xpd=TRUE)
) es superponer su trama con una trama transparente sobre todo el dispositivo y luego agregarle la leyenda.
El truco consiste en superponer un gráfico (vacío) sobre el área de trazado completa y agregarle la leyenda. Podemos usar la par(fig=...)
opción. Primero le indicamos a R que cree una nueva trama sobre todo el dispositivo de trazado:
par(fig=c(0, 1, 0, 1), oma=c(0, 0, 0, 0), mar=c(0, 0, 0, 0), new=TRUE)
Configuración oma
y mar
es necesaria ya que queremos que el interior de la trama cubra todo el dispositivo. new=TRUE
es necesario para evitar que R inicie un nuevo dispositivo. Luego podemos agregar el diagrama vacío:
plot(0, 0, type='n', bty='n', xaxt='n', yaxt='n')
Y estamos listos para agregar la leyenda:
legend("bottomright", ...)
agregará una leyenda en la parte inferior derecha del dispositivo. Del mismo modo, podemos agregar la leyenda al margen superior o derecho. Lo único que debemos asegurar es que el margen de la trama original sea lo suficientemente grande como para acomodar la leyenda.
Poniendo todo esto en una función;
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(...)
}
Y un ejemplo. Primero cree la trama asegurándose de que tengamos suficiente espacio en la parte inferior para agregar la leyenda:
par(mar = c(5, 4, 1.4, 0.2))
plot(rnorm(50), rnorm(50), col=c("steelblue", "indianred"), pch=20)
Luego agrega la leyenda
add_legend("topright", legend=c("Foo", "Bar"), pch=20,
col=c("steelblue", "indianred"),
horiz=TRUE, bty='n', cex=0.8)
Resultando en: