Añadir leyenda en R

Añadir leyenda a un gráfico 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()

Ejemplo gráfico de funciones de Bessel

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

Añadir una leyenda a un gráfico en R

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)

Cambiar posición leyenda en R

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)

Ajustar distancia al margen leyenda R

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

Gráfico de barras en R con leyenda

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

Relleno leyenda shading lines

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)

Agregar título a una leyenda en R

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)

Color y estilo del borde de la leyenda en R

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)

Eliminar borde leyenda en R

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 color de la leyenda en R

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)

Cambiar el tamaño de la leyenda en R

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))

Agregar una leyenda fuera del gráfico en R

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))

Leyenda horizontal debajo del gráfico en R

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)

Añadir dos leyendas en R

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))

Dos leyendas en R

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")

Etiquetar lineas con leyendas

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))

Agregar información adicional a la leyenda