Otra solución, además de los ya mencionados ondes (usando layout
o par(xpd=TRUE)
) es para superponer su trama con una trama transparente sobre todo el dispositivo y luego añadir la leyenda a eso.
El truco consiste en superponer un gráfico (vacío) en toda el área de trazado y agregar la leyenda a eso. Podemos usar la opción par(fig=...)
. En primer lugar instruimos R para crear una nueva parcela en el transcurso de 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)
ajuste es necesario oma
y mar
ya que quieren tener el interior de la parcela cubre todo el dispositivo. new=TRUE
es necesario para evitar que R inicie un nuevo dispositivo. a continuación, podemos añadir la trama vacío:
plot(0, 0, type='n', bty='n', xaxt='n', yaxt='n')
Y estamos listos para agregar la leyenda:
legend("bottomright", ...)
añadirá una leyenda en la parte inferior derecha del dispositivo. Del mismo modo, podemos agregar la leyenda al margen superior o derecho. Lo único que tenemos que 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.En primer lugar crear la trama asegurarnos de tener 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)
A continuación, agregue la leyenda
add_legend("topright", legend=c("Foo", "Bar"), pch=20,
col=c("steelblue", "indianred"),
horiz=TRUE, bty='n', cex=0.8)
El resultado es:
... también se puede piratear la par con contenedor ciego para la leyenda, el tiempo de vida fácil y muy conveniente. Pregunta similar [aquí] (http://stackoverflow.com/questions/8736647/adding-legend-annotate-to-rs-plot-similar-to-rs-ggplot). – hhh
@hhh El enlace ya no funciona. ¿Puedes actualizarlo o publicar una respuesta usando este enfoque? – Henrik