Saltar al contenido

¿Trazar una leyenda fuera del área de trazado en gráficos base?

Te damos la bienvenida a nuestro espacio, en este lugar hallarás la solucíon que estabas buscando.

Solución:

Nadie ha mencionado el uso de negativos. inset valores para legend. Aquí hay un ejemplo, donde la leyenda está a la derecha de la gráfica, alineada en la parte superior (usando la palabra clave "topright").

# Random data to plot:
A <- data.frame(x=rnorm(100, 20, 2), y=rnorm(100, 20, 2))
B <- data.frame(x=rnorm(100, 21, 1), y=rnorm(100, 21, 1))

# Add extra space to right of plot area; change clipping to figure
par(mar=c(5.1, 4.1, 4.1, 8.1), xpd=TRUE)

# Plot both groups
plot(y ~ x, A, ylim=range(c(A$y, B$y)), xlim=range(c(A$x, B$x)), pch=1,
               main="Scatter plot of two groups")
points(y ~ x, B, pch=3)

# Add legend to top right, outside plot region
legend("topright", inset=c(-0.2,0), legend=c("A","B"), pch=c(1,3), title="Group")

El primer valor de inset=c(-0.2,0) podría necesitar un ajuste basado en el ancho de la leyenda.

leyenda_derecha

Tal vez lo que necesitas es par(xpd=TRUE) para permitir que las cosas se dibujen fuera de la región de la trama. Así que si haces la trama principal con bty='L' tendrás algo de espacio a la derecha para una leyenda. Normalmente, esto se recortaría en la región de la trama, pero no par(xpd=TRUE) y con un poco de ajuste puede obtener una leyenda lo más a la derecha posible:

 set.seed(1) # just to get the same random numbers
 par(xpd=FALSE) # this is usually the default

 plot(1:3, rnorm(3), pch = 1, lty = 1, type = "o", ylim=c(-2,2), bty='L')
 # this legend gets clipped:
 legend(2.8,0,c("group A", "group B"), pch = c(1,2), lty = c(1,2))

 # so turn off clipping:
 par(xpd=TRUE)
 legend(2.8,-1,c("group A", "group B"), pch = c(1,2), lty = c(1,2))

Otra solución, además de las ondas ya mencionadas (utilizando 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 el par(fig=...) opción. Primero le indicamos a R que cree un nuevo gráfico 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)

Ajuste oma y mar es necesario 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 la trama vacía:

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. Así mismo, podemos añadir la leyenda en el margen superior o derecho. Lo único que debemos asegurarnos 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 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)

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:

Figura de ejemplo que se muestra con la leyenda en el margen superior

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *