Agregar una leyenda en R

La función legend permite agregar leyendas a gráficos de R base.

Vamos a utilizar el siguiente gráfico en los ejemplos de esta guía.

# Gráfico reproducible
plotl <- function(points = FALSE, ...) {
    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)
    if(points == TRUE) {
      points(c(1335, 1325),
             c(besselJ(x, 0)[1335],
               besselJ(x, 2)[1325]),
             pch = c(15, 18), cex = 2, col = 2:3)
    }
}
 
plotl()

Gráfico reproducible

Posición de la leyenda, líneas y relleno

Opción 1. Establece el argumento x a "top", "topleft", "topright", "bottom", "bottomleft", "bottomright", "left", "right" o "center". En este escenario no tendrás que establecer el argumento y.

Posición de la leyenda en R

El texto de la leyenda se puede establecer con el argumento legend y el tipo de línea, el ancho y el color con los argumentos lty, lwd y col, respectivamente.

plotl()
legend(x = "topright",         # Posición
       legend = c("J0", "J2"), # Textos de la leyenda
       lty = c(1, 2),          # Tipos de línea
       col = c(2, 3),          # Colores
       lwd = 2)                # Ancho de línea

Opción 2. Usa los argumentos x e y como coordenadas para indicar donde dibujar la leyenda.

Usando coordenadas para establecer la posición de la leyenda en R

plotl()
legend(x = 1900, y = 0.8,      # Coordenadas
       legend = c("J0", "J2"), # Textos de la leyenda
       lty = c(1, 2),          # Tipos de línea
       col = c(2, 3),          # Colores
       lwd = 2)                # Ancho de línea

Opción 3. Usa una posición y establece el margen desde el borde con el argumento inset.

Distancia desde el margen de la leyenda

El valor del argumento representa la distancia desde el margen como fracción de la región del gráfico.

plotl()
legend("topright",
       inset = 0.05, # Distancia desde el margen
       legend = c("J0", "J2"),
       lty = c(1, 2),
       col = c(2, 3),
       lwd = 2)

Ten en cuenta que también puedes establecer pch para indicar símbolos sobre las líneas en caso de ser necesario

Leyenda con símbolos pch

plotl(points = TRUE)
legend("topright",
       inset = 0.05, 
       legend = c("J0", "J2"),
       lty = c(1, 2),
       col = c(2, 3),
       lwd = 2,
       pch = c(15, 18)) # Símbolos pch

Si tienes un gráfico de barras, de sectores u otro gráfico con relleno puedes establecer el argumento fill en lugar de lty.

Leyenda de un gráfico de barras en R

Puedes crear cuadrados rellenos con el argumento fill, cuyo color de borde se puede cambiar con el argumento border.

barplot(table(mtcars$gear), col = 2:4)

legend("topright",
       legend = c(3, 4, 5),
       fill = 2:4,       # Color de los cuadrados
       border = "black") # Color del borde de 
                         # los cuadrados

Leyenda con líneas de sombreado

Si las áreas de tu gráfico están sombreadas con líneas puedes especificar los argumentos density y angle para emparejarlos.

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

Orientación de la leyenda

Estableciendo horiz = FALSE se mostrará una leyenda en modo horizontal.

plotl()
legend("top",
       legend = c("J0", "J2"),
       lty = c(1, 2),
       col = c(2, 3),
       lwd = 2,
       horiz = TRUE)

Leyenda horizontal en R

También puedes especificar el número de columnas de la leyenda si horiz = FALSE con el argumento ncol.

plotl()
legend("top",
       legend = c("J0", "J2"),
       lty = c(1, 2),
       col = c(2, 3),
       lwd = 2,
       ncol = 2)

Número de columnas de una leyenda en R

Título de la leyenda

Añadir un título a una leyenda de R

Es posible agregar un título a la leyenda y modificar su ajuste horizontal y color con los argumentos title, title.adj y title.col, respectivamente.

plotl()
legend("topright", legend = c("J0", "J2"),
       title = "TÍTULO",   # Título
       title.adj = 0.5,    # Ajuste horizontal
       title.col = "blue", # Color del título
       lty = c(1, 2), col = c(2, 3), lwd = 2)

Borde de la caja y color de fondo de la leyenda

Los argumentos box.lty, box.lwd y box.col permiten modificar el tipo de línea, el ancho y el color de la caja de la leyenda, 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)

Cambiar el estilo del borde o caja de una leyenda en R

Además de lo anterior también puedes modificar el color de fondo de la caja con el argumento bg.

plotl()
legend("topright", inset = 0.05,
       legend = c("J0", "J2"),
       bg = rgb(1, 0, 0, alpha = 0.15),
       lty = c(1, 2),
       col = c(2, 3),
       lwd = 2)

Cambiar el color de fondo de una leyenda en R

Eliminar la caja

Puedes eliminar la caja (borde) de la leyenda usando dos métodos diferentes.

Eliminar el recuadro de la leyenda

Opción 1. Establece bty = "n".

plotl()
legend(1500, 0.9,
       legend = c("J0", "J2"),
       bty = "n", # Elimina la caja
       lty = c(1, 2),
       col = c(2, 3),
       lwd = 2)

Eliminar la caja de una leyenda en R

Opción 2. Establece box.lty = 0

plotl()
legend(1500, 0.9,
       legend = c("J0", "J2"),
       box.lty = 0, # Elimina la caja
       lty = c(1, 2),
       col = c(2, 3),
       lwd = 2)

Tamaño de la leyenda

El argumento cex controla el tamaño de la leyenda. El valor por defecto es 1.

plotl()
legend("topright",
       legend = c("J0", "J2"),
       lty = c(1, 2),
       col = c(2, 3),
       cex = 1.5, # Tamaño
       lwd = 2)

Cambiar el tamaño de una leyenda en R

Leyenda fuera del gráfico

En algunos escenarios tendrás que establecer la leyenda fuera del gráfico porque no cabe dentro. Para ello tendrás que incrementar los márgenes del gráfico, agregar la leyenda, establecer el argumento xpd como TRUE y ajustar los valores del argumento inset.

# Haz la ventana más ancha que alta
# windows(width = 5.5, height = 5)

# Guarda los parámetros gráficos actuales
opar <- par(no.readonly = TRUE)

# Cambia los márgenes del gráfico
# (el cuarto es el margen derecho)
par(mar = c(6, 5, 4, 6.5))

plotl()
legend(x = "topright",
       inset = c(-0.35, 0), # Tendrás que ajustar el primer valor
                            # dependiendo del tamaño de la ventana
       legend = c("J0", "J2"), 
       lty = c(1, 2),
       col = c(2, 3),
       lwd = 2,
       xpd = TRUE) # Necesario para poner la leyenda fuera del gráfico

# Volvemos a los parámetros gráficos originales
on.exit(par(opar))

Leyenda fuera del gráfico

Leyenda debajo del gráfico

Una alternativa es establecer la leyenda debajo (o encima) del gráfico siguiendo el mismo procedimiento de antes pero incrementando los márgenes inferior or superior.

# windows(width = 5, height = 5)

# Guarda los parámetros gráficos actuales
opar <- par(no.readonly = TRUE)

# Cambia 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.35), # Tendrás que ajustar el segundo valor
                            # dependiendo del tamaño de la ventana
       legend = c("J0", "J2"), 
       lty = c(1, 2),
       col = c(2, 3),
       lwd = 2,
       xpd = TRUE,   # Necesario para poner la leyenda fuera del gráfico
       horiz = TRUE) # Leyenda horizontal

# Volvemos a los parámetros gráficos originales
on.exit(par(opar))

Leyenda debajo del gráfico en R

Data Sketches

A journey of imagination, exploration, and beautiful data visualizations

Comprar en Amazon
ggplot2

Elegant Graphics for Data Analysis

Comprar en Amazon
Better Data Visualizations

A Guide for Scholars, Researchers, and Wonks

Comprar en Amazon
Fundamentals of Data Visualization

A Primer on Making Informative and Compelling Figures

Comprar en Amazon

También te puede interesar