Añadir leyenda en R
La leyenda de un gráfico ayuda a comprender qué series o grupos corresponden a cada barra, línea, cuadro u observaciones, según su tipo, color o ambos. En este tutorial aprenderás cómo añadir una leyenda en R base y cómo personalizarla.
La función legend() en R
La función legend
permite agregar una leyenda a un gráfico en R base. La sintaxis resumida de la función con los argumentos más comunes se describe en el siguiente bloque:
legend(x, y, # Coordenadas (x también acepta palabras clave)
legend, # Vector con el nombre de cada grupo
fill, # Crea rectángulos en la leyenda con los colores especificados
col = par("col"), # Color de las líneas o símbolos
border = "black", # Color del borde de los rectángulos
lty, lwd, # Tipo y ancho de línea
pch, # Añade símbolos pch a las líneas o rectángulos
bty = "o", # Tipo de caja de la leyenda (bty = "n" elimina el borde)
bg = par("bg") # Color de fondo de la leyenda
box.lwd = par("lwd"), # Ancho de línea de la leyenda
box.lty = par("lty"), # Tipo de línea de la leyenda
box.col = par("fg"), # Color de línea de la leyenda
cex = 1, # Tamaño de la leyenda
horiz = FALSE # Leyenda horizontal (TRUE) o vertical (FALSE)
title = NULL # Título de la leyenda
)
Ten en cuenta que hay más argumentos que puedes utilizar, pero hemos listado los más comunes, así que escribe args(legend)
, ?legend
o help(legend)
para obtener información adicional.
En las siguientes secciones explicaremos cómo personalizar los argumentos más habituales de la función. Para evitar repetir el código, utilizaremos la siguiente función para dibujar dos funciones de Bessel en R (\(J_0(x)\) y \(J_2(x)\)):
plotl <- function(...) {
x <- seq(0, 30, 0.01)
plot(besselJ(x, 0), col = 2, type = "l",
lwd = 2, ylab = "Jn(x)", xlab = "", ...)
lines(besselJ(x, 2), col = 3, type = "l", lwd = 2, lty = 2)
}
plotl()
Los gráficos de este artículo se han creado con ventanas de ancho y alto de 4 pulgadas (10.16 cm): windows(4, 4)
, a menos que se indique lo contrario. En caso de utilizar otros tamaños, es posible que necesites ajustar algunos argumentos para obtener los mismos resultados.
Posición, líneas y relleno
Al agregar una leyenda a un diagrama, hay dos formas principales de modificar la posición de la leyenda con la función legend
.
Por una parte, puedes establecer el argumento x
como "top"
, "topleft"
, "topright"
, "bottom"
, "bottomleft"
, "bottomright"
, "left"
, "right"
o "center"
. En este escenario no necesitas establecer el argumento y
.
plotl()
legend(x = "topright", # Posición
legend = c("J0", "J2"), # Textos de la leyenda
lty = c(1, 2), # Tipo de líneas
col = c(2, 3), # Colores de las líneas
lwd = 2) # Ancho de las líneas
Por otra parte, puedes usar los argumentos x
e y
como coordenadas para indicar dónde se debe dibujar la leyenda.
plotl()
legend(x = 1900, y = 0.8, # Coordenadas
legend = c("J0", "J2"),
lty = c(1, 2),
col = c(2, 3),
lwd = 2)
Sin embargo, también puedes modificar la distancia al margen, en caso de que no quieras que la leyenda esté pegada al margen, con el argumento inset
:
plotl()
legend("topright", # Posición
inset = 0.05, # Distancia desde el margen como fracción de la región del gráfico
legend = c("J0", "J2"),
lty = c(1, 2),
col = c(2, 3),
lwd = 2)
Si las líneas del gráfico contienen algún símbolo puedes agregarlos a la leyenda con el argumento pch
.
Ten en cuenta que si necesitas agregar una leyenda a un diagrama de barras, gráfico de sectores o diagrama de caja, puedes usar el argumento fill
en lugar de establecer líneas.
barplot(table(mtcars$gear), col = 2:4)
legend("topright",
legend = c(3, 4, 5),
fill = 2:4, # Color de los rectángulos
border = "black") # Color del borde de los rectángulos
Si tu gráfico tiene líneas de sombreado, también puede agregarlas a la leyenda con el argumentos density
y modificar el ángulo con el argumento angle
de la función.
barplot(table(mtcars$gear), col = 2:4, density = 30, angle = 90)
legend("topright",
legend = c(3, 4, 5),
fill = 2:4,
density = 30, # Líneas de sombreado
angle = 90) # Ángulo de las líneas de sombreado
Título de la leyenda en R
En caso de que necesites añadir un título a la leyenda, para agregar alguna descripción de los elementos de la leyenda, puedes usar el argumento title
. Ten en cuenta que puedes personalizar el color del texto con el argumento title.col
y que puedes hacer un ajuste horizontal del título con el argumento title.adj
.
plotl()
legend("topright", legend = c("J0", "J2"),
title = "TÍTULO LEYENDA", # Título
title.adj = 0.5, # Ajuste horizontal del título
title.col = "blue", # Color del título
lty = c(1, 2), col = c(2, 3), lwd = 2)
Nótese que el argumento text.font
permite modificar la fuente del texto de la leyenda.
Bordes y colores de la leyenda
Por defecto, la leyenda se dibuja dentro de un rectángulo negro. No obstante, puedes cambiar el tipo, el ancho y el color de la línea del rectángulo con los argumentos box.lty
, box.lwd
y box.col
, respectivamente.
plotl()
legend(1500, 0.9,
legend = c("J0", "J2"),
box.lty = 2, # Tipo de línea de la caja
box.lwd = 2, # Ancho de línea de la caja
box.col = 4, # Color de línea de la caja
lty = c(1, 2),
col = c(2, 3),
lwd = 2)
También puedes deshabilitar el borde del recuadro configurando el argumento bty
como "n"
. Ten en cuenta que una alternativa es establecer box.lty = 0
.
plotl()
legend(1500, 0.9,
legend = c("J0", "J2"),
bty = "n", # Elimina la línea de la caja
lty = c(1, 2),
col = c(2, 3),
lwd = 2)
Además, si byt
es diferente de "n"
, puedes establecer el color de fondo del cuadro de la leyenda. Ten en cuenta que si no quieres mostrar el borde, puedes configurarlo con el color de fondo del gráfico o el color de fondo del cuadro o, en otro caso, establecer box.lty = 0
.
plotl()
legend("topright", inset = 0.05,
legend = c("J0", "J2"),
bg = rgb(1, 0, 0, alpha = 0.15), # Color de fondo
box.col = "white", # Color del borde
lty = c(1, 2),
col = c(2, 3),
lwd = 2)
Cambiar el tamaño de la leyenda
Para cambiar el tamaño de la leyenda en R puedes utilizar el argumento cex
. Los valores mayores que 1 crearán a una leyenda más grande y los menores, leyendas más pequeñas que las predeterminadas.
plotl()
legend("topright",
legend = c("J0", "J2"),
lty = c(1, 2),
col = c(2, 3),
cex = 1.5, # Cambiar el tamaño
lwd = 2)
Añadir leyenda fuera del gráfico en R
A veces, la representación cubre toda el área del gráfico. En ese caso, es una buena idea mover la leyenda fuera del gráfico. Para ello, deberás utilizar la función par
, modificar los márgenes de la gráfica y los argumentos inset
y xpd
de la siguiente manera:
# Ventana gráfica más ancha que alta
windows(width = 4.5, height = 4)
# Guardamos los parámetros gráficos actuales
opar <- par(no.readonly = TRUE)
# Cambiar los márgenes del gráfico (el cuarto es el margen derecho)
par(mar = c(5, 5, 4, 6))
plotl()
legend(x = "topright",
inset = c(-0.45, 0), # Tendrás que ajustar el primer valor
# dependiendo del tamaño de tu gráfico
legend = c("J0", "J2"),
lty = c(1, 2),
col = c(2, 3),
lwd = 2,
xpd = TRUE) # Tienes que especificar este parámetro gráfico
# para poner la leyenda fuera del gráfico
# Volvemos a los parámetros gráficos por defecto
on.exit(par(opar))
Recuerda que para gráficos de otros tamaños necesitarás ajustar los márgenes y el el argumento inset
para obtener la gráfica correcta.
Una alternativa es poner la leyenda debajo del gráfico. Para ello, puedes establecer los márgenes, el argumento inset
y la posición como sigue:
windows(width = 4, height = 4)
# Guardamos los parámetros gráficos actuales
opar <- par(no.readonly = TRUE)
# Cambiamos los márgenes del gráfico (el primero es el margen inferior)
par(mar = c(6, 4.1, 4.1, 2.1))
plotl()
legend(x = "bottom",
inset = c(0, -0.5), # Tendrás que ajustar el segundo valor
# dependiendo del tamaño de tu gráfico
legend = c("J0", "J2"),
lty = c(1, 2),
col = c(2, 3),
lwd = 2,
xpd = TRUE, # Tienes que especificar este parámetro gráfico
# para poner la leyenda fuera del gráfico
horiz = TRUE) # Leyenda horizontal. También puedes establecer
# el número de columnas con el argumento ncol
# si horiz = FALSE
# Volvemos a los parámetros gráficos por defecto
on.exit(par(opar))
Añadir dos leyendas en R
Puedes agregar dos o más leyendas a un gráfico, simplemente ejecutando la función legend
varias veces con diferentes argumentos. En el siguiente ejemplo, agregaremos dos funciones de Bessel más y añadiremos una nueva leyenda para ellas.
plotl()
lines(besselJ(seq(0, 30, 0.01), 3), col = 4, type = "l", lwd = 2, lty = 2)
lines(besselJ(seq(0, 30, 0.01), 4), col = 5, type = "l", lwd = 2, lty = 2)
legend("topright",
legend = c("J0", "J2"),
lty = c(1, 2), col = c(2, 3), lwd = 2)
legend("top",
legend = c("J3", "J4"),
lty = 2, col = c(4, 5), lwd = 2)
Ten en cuenta que también puedes agregar más leyendas fuera del gráfico, en caso de que las leyendas no quepan dentro:
# Hacemos la ventana gráfica mas ancha que alta
windows(width = 4.5, height = 4)
# Guardamos los parámetros gráficos actuales
opar <- par(no.readonly = TRUE)
par(mar = c(5, 5, 4, 6))
# Creamos el gráfico
plotl()
lines(besselJ(seq(0, 30, 0.01), 3), col = 4, type = "l", lwd = 2, lty = 2)
lines(besselJ(seq(0, 30, 0.01), 4), col = 5, type = "l", lwd = 2, lty = 2)
# Agregamos la primera leyenda
legend(x = "topright",
inset = c(-0.45, 0),
legend = c("J0", "J2"),
lty = c(1, 5), col = c(2, 3),
lwd = 2, xpd = TRUE
)
# Añadimos la segunda leyenda
legend(x = "right",
inset = c(-0.45, 0),
legend = c("J3", "J4"),
lty = 2, col = c(4, 5),
lwd = 2, xpd = TRUE
)
# Volvemos a los parámetros gráficos originales
on.exit(par(opar))
Agregar etiquetas como leyenda
También puede agregar una leyenda a un gráfico de una manera diferente. En el caso de que tengas un gráfico con varias líneas, puedes agregar una leyenda cerca de cada línea para identificarla. Para ello, puedes utilizar la función legend
tantas veces como líneas haya de la siguiente manera:
plotl(xlim = c(0, 4000))
legend(2800, 0.05, legend = "J0", bty = "n")
legend(2800, 0.25, legend = "J2", bty = "n")
Una alternativa es usar la función text
y especificar el texto y la posición. E.g. text(3500, -0.075, "J0")
.
Añadir más información a una leyenda
Por último, cabe mencionar que, si es necesario, puedes agregar más información a una gráfica a modo de leyenda. Para ese propósito, puedes modificar los márgenes del gráfico y agregar texto adicional con la función text
.
# Ventana más alta que ancha
windows(width = 4, height = 5.5)
# Guardamos los parámetros gráficos actuales
opar <- par(no.readonly = TRUE)
# Márgenes del gráfico (el primero es el margen inferior)
par(mar = c(12, 4.1, 4.1, 2.1))
#Gráfico
plotl()
# Leyenda debajo del gráfico
legend(x = "bottom",
inset = c(0, -0.5), # Tendrás que ajustar el primer valor
# dependiendo del tamaño de la ventana gráfica
legend = c("J0", "J2"),
lty = c(1, 2),
col = c(2, 3),
lwd = 2,
xpd = TRUE, # Tienes que especificar este parámetro gráfico
# para poner la leyenda fuera del gráfico
horiz = TRUE) # Leyenda horizontal. También puedes establecer
# el número de columnas con el argumento ncol
# si horiz = FALSE
# Añadimos información adicional
par(xpd = TRUE)
text(1500, -1.5, "Puedes añadir información adicionaln sobre el gráfico o la leyenda")
# Volvemos a los parámetros gráficos por defecto
on.exit(par(opar))