Títulos, etiquetas, marcas, límites y escalas de los ejes en ggplot2

Gráficos de muestra

En este tutorial vamos a utilizar los siguientes gráficos de muestra y luego personalizar sus ejes. Ten en cuenta que los ejes pueden ser continuos si la variable es numérica, discretos para categorías o grupos o de tipo fecha si el eje representa fechas.

El siguiente ejemplo es un gráfico de cajas por grupo con un eje X discreto y un eje Y continuo:

# install.packages("ggplot2")
library(ggplot2)

# Datos de muestra
x <- droplevels(chickwts$feed[1:36])
levels(x) <- LETTERS[1:3]
y <- chickwts$weight[1:36]
df <- data.frame(x = x, y = y)

# Gráfico
p <- ggplot(df, aes(x = x, y = y)) + 
      stat_boxplot(geom = "errorbar",
                   width = 0.25) +
      geom_boxplot(fill = "dodgerblue1",
                   colour = "black",
                   alpha = 0.5,
                   outlier.colour = "tomato2")
p

Gráfico de ggplot2 con un eje discreto y el otro continuo

El otro gráfico de ejemplo que vamos a utilizar es un gráfico de dispersión, por lo que ambos ejes son continuos.

# install.packages("ggplot2")
library(ggplot2)

# Gráfico de muestra con ejes continuos
ggplot(cars, aes(x = speed, y = dist)) +
  geom_point() 

Gráfico de ggplot2 con ejes continuos

El gráfico de muestra con los gráficos de caja tiene un eje X discreto y un eje Y continuo, por lo que es posible que necesites adaptar algunos de los ejemplos de este tutorial dependiendo de tus datos. Por ejemplo, si el eje X de tu gráfico es continuo y quieres cambiar las etiquetas tendrás que utilizar scale_x_continuous en lugar de scale_x_discrete.

Títulos de los ejes

La función labs

Por defecto, los títulos de los ejes son el nombre de las variables asignadas a cada eje dentro de aes, pero puedes cambiar las etiquetas por defecto con la función labs de la siguiente manera.

p + labs(x = "Título del eje X", y = "Título del eje Y")

La función labs de ggplot2 para cambiar los títulos de los ejes

Las funciones xlab e ylab

Alternativamente, puedes usar las funciones xlab e ylab para establecer los títulos de los ejes de manera individual.

p + xlab("Título del eje X") +
    ylab("Título del eje Y")

Las funciones xlab e ylab de ggplot2

Tamaño, colores y estilos

El estilo de los títulos de los ejes se puede modificar a través del componente axis.title de la función theme. Tendrás que pasar un element_text y personalizar el estilo con los argumentos correspondientes, como size, color o face.

p + labs(x = "Título del eje X", y = "Título del eje Y") + 
  theme(axis.title = element_text(size = 15,
                                  color = "blue",
                                  face = "bold"))

Tamaño y color de los títulos de los ejes de ggplot2

Ten en cuenta que también puedes personalizar cada eje de manera individual agregando .x o .y a axis.title de la siguiente manera. Recuerda que si no especificas uno de ellos, éste heradará las estéticas por defecto.

p + labs(x = "Título del eje X", y = "Título del eje Y") + 
 theme(axis.title.x = element_text(size = 15,
                                   color = "blue",
                                   face = "bold"),
       axis.title.y = element_text(size = 10,
                                   color = "red",
                                   face = "italic"))

Personalizar el estilo de un eje en ggplot2

Eliminar los títulos de los ejes

Eliminar los títulos de ambos ejes

Pasando element_blank() a un componente borrará el elemento correspondiente. Para eliminar los títulos de los ejes puedes pasar la función element_blank al componente axis.title, incluso aunque ya los hayas especificado, siempre y cuando no los vuelvas a agregar en una nueva capa.

p + xlab("Título del eje X") +
    ylab("Título del eje Y") + 
    theme(axis.title = element_blank())

Eliminar los títulos de los ejes en ggplot2 con element_blank

Eliminar el título de un solo eje

Si añades .x o .y al componente axis.title puedes eliminar solo uno de los títulos de los ejes. Esto es, puedes eliminar el título del eje X estableciendo axis.title.x = element_blank() y el del eje Y con axis.title.y = element_blank().

p + xlab("Título del eje X") +
    ylab("Título del eje Y") + 
    theme(axis.title.x = element_blank())

Eliminar solo uno de los títulos de los ejes en ggplot2

Etiquetas de los ejes

Cada eje mostrará etiquetas o textos de manera automática. Por ejemplo, las etiquetas por defecto para el eje Y de nuestro ejemplo van desde 100 hasta 300 de 50 en 50 y las etiquetas del eje X son los nombres de los distinto grupos (A, B y C). Estas etiquetas se pueden personalizar con scale_(x|y)_continuous si el eje (x o y) es continuo, con scale_(x|y)_discrete si el eje es discreto o con otras variantes, como scale_(x|y)_datetime, scale_(x|y)_date, scale_(x|y)_reverse, scale_(x|y)_log10, etc.

Personalizar los textos de los ejes en ggplot2 con una función

Etiquetas personalizadas para el eje Y

Como el eje Y de nuestro ejemplo es continuo podemos utilizar la función scale_y_continuous para personalizarlo. El argumento labels es el que se utiliza para personalizar las etiquetas, y permite pasar un vector con las nuevas etiquetas o una función para modificar las etiquetas, como en el ejemplo siguiente.

# Etiquetas personalizadas para el eje Y 
etiquetas <- function(x) {
  paste(x, "gramos")
}

p + scale_y_continuous(label = etiquetas)

La longitud del vector que se pasa a labels debe ser igual al número de marcas (breaks) que tenga el eje. Revisa la siguiente sección para obtener detalles adicionales.

Cómo cambiar las etiquetas de los ejes en ggplot2 con scale_x_discrete

Etiquetas personalizadas para el eje X

Como el eje X de nuestra muestra representa grupos, es discreto, de modo que podemos utilizar la función scale_x_discrete para personalizar las etiquetas del eje X. Puedes pasar una función o un vector con los nuevos nombres a labels.

# Etiquetas personalizadas para el eje X
labels <- c("Grupo 1", "Grupo 2", "Grupo 3")

p + scale_x_discrete(label = labels)

Tamaño, colores y estilos de las etiquetas de los ejes

Cambiar el color y tamaño de las etiquetas de los ejes con ggplot2

Color de los textos de los ejes

Con el componente axis.text de la función theme puedes controlar el estilo de las etiquetas de los ejes. Si pasas un element_text podrás personalizar el estilo de los textos con sus argumentos, como su color, tamaño, ángulo…

p +
 theme(axis.text = element_text(color = "slateblue",
                                size = 12))

Establecer un estilo diferente para cada eje en ggplot2

Color de texto diferente para cada uno de los ejes

Recuerda que puedes aplicar un estilo diferente para cada eje agregando .x o .y al componente correspondiente, esto es, con axis.text.x y con axis.text.y.

p +
 theme(axis.text.x = element_text(color = "cyan2",
                                  size = 12),
       axis.text.y = element_text(color = "red",
                                  size = 10,
                                  hjust = 1))

Marcas de los ejes

Las marcas de los ejes, también llamadas ticks en inglés, son las que dividen los ejes. Estas marcas se ajustan automáticamente en base a tus datos, pero también puedes personalizarlas. Es posible incrementar o reducir el número de marcas de los ejes, personalizar su estilo, aumentar su tamaño o simplemente eliminarlas.

Incrementar el número de marcas

El número de marcas de los ejes se puede personalizar pasando un vector con los valores deseados al argumento breaks de la función scale_y_continuous. En el ejemplo siguiente pasamos una secuencia de valores que van de 120 a 320 en saltos de 20 en 20.

p + 
  scale_y_continuous(breaks = seq(120, 320, by = 20))

Aumentar o disminuir el número de marcas de ejes o breaks en ggplot2

Aumentar el tamaño de las marcas

La función theme proporciona un componente llamado axis.ticks.length para incrementar o reducir el tamaño de las marcas de los ejes. Para lograrlo tendrás que pasar la función unit y especificar el tamaño deseado en la unidad que quieras. Recuerda utilizar axis.ticks.length.x o axis.ticks.length.y para personalizar las marcas de un único eje.

p + 
  theme(axis.ticks.length  = unit(0.5, "cm"))

Aumentar o reducir el tamaño de las marcas de los ejes de ggplot2

Modificar el estilo de las marcas

Puedes personalizar el estilo de las marcas de los ejes pasando un element_line al componente axis.ticks de la función theme, especificando el color que quieras, el tamaño, el tipo de línea, etc. Recuerda agregar .x o .y para personalizar solo un eje.

p + 
  theme(axis.ticks = element_line(color = 2,
                                  linewidth = 2))

Modificar el estilo de las marcas de los ejes en ggplot2

Eliminar las marcas de los ejes

Al igual que ocurre con otros componentes, pasando la función element_blank al componente axis.ticks eliminará las marcas de eje de ambos ejes. Si solo quieres eliminar las marcas de un eje pasa la función a axis.ticks.x o a axis.ticks.y.

p + 
  theme(axis.ticks = element_blank())

Eliminar las marcas de los ejes en ggplot2

La función theme también proporciona los componentes axis.ticks.x.top, axis.ticks.x.bottom, axis.ticks.y.left, axis.ticks.y.right, axis.ticks.length.x, axis.ticks.length.x.top, axis.ticks.length.x.bottom, axis.ticks.length.y, axis.ticks.length.y.left y axis.ticks.length.x.right.

Límites de los ejes

El rango o límites de los ejes los ajusta ggplot2 de manera automática en base al rango de tus datos. Sin embargo, puedes sobrescribir los ajustes por defecto y personalizar los límites para hacer zoom o para crear un subconjunto de los datos.

Zooming en ggplot2 con la función coord_cartesian

coord_cartesian (zoom)

Si quieres hacer zoom al gráfico sin eliminar datos tendrás que utilizar los argumentos ylim y xlim de la función coord_cartesian.

p + 
   coord_cartesian(ylim = c(100, 200))

Límites del eje Y en ggplot2 con la función ylim

Las funciones ylim y xlim (subconjuntos)

Las funciones xlim e ylim crean un subconjunto de los datos en el rango especificado y calculan las estadísticas para ese subconjunto. Es importante entender que estas funciones no hacen zoom, sino que crean subconjuntos de los datos.

p + 
   ylim(c(100, 200))

Modificar los límites de los ejes en ggplot2 con xlim

Ten en cuenta que si uno de los ejes es discreto puedes crear un subconjunto pasando un vector con los nombres de los grupos deseados.

p + 
   xlim(c("A", "B"))

Forzar a que los ejes de ggplot2 empiecen en 0 con la función expand_limits

Empezar en el origen

Puedes forzar los ejes del gráfico de ggplot2 para que empiecen en el origen con la función expand_limits, que obliga a los ejes a incluir el valor o valores que se pasan a los argumentos x o y de la función.

p + 
  expand_limits(x = 0, y = 0)

Escalas de los ejes

Las escalas de los ejes se establecen de manera automática por ggplot2 en base a los datos, pero en ocasiones puede que quieras personalizarlas. Por ejemplo, si los números son demasiado grandes, ggplot2 usará notación científica y puede que quieras eliminarla, o puede que quieras personalizar el separador decimal o de miles, cambiar el formato de los ejes o tratarlos como moneda o quizás quieras transformar la escala en escala logarítimica.

Eliminar la notación científica

Si los números del eje son demasiado grandes, ggplot2 los mostrará por defecto en notación científica. Sin embargo, puedes utilizar la función del siguiente bloque de código para establecer las nuevas etiquetas sin notación científica y con separador decimal y de miles.

# Función para eliminar la notación científica y agregar separadores
marks_no_sci <- function(x) format(x, big.mark = ".", decimal.mark = ",", scientific = FALSE)

ggplot(cars, aes(x = speed, y = dist * 1000000)) +
  geom_point() +
  scale_y_continuous(labels = marks_no_sci)

Cómo eliminar la notación científica de los ejes de ggplot2

Eliminar la notación científica con scales

El paquete scales proporciona métodos automáticos para establecer puntos de corte y etiquetas para los ejes. Para eliminar la notación científica, tan solo tendrás que pasar la función que quieras utilizar (label_number o label_comma en este escenario) a labels.

# install.packages("scales")
library(scales)

ggplot(cars, aes(x = speed, y = dist * 1000000)) +
  geom_point() +
  scale_y_continuous(labels = label_number())

Usar el paquete scales y ggplot2 para eliminar la notación científica de los ejes

Otra alternativa es establecer algo como options(scipen = -10). Recuerda que el entero que se pasa se basa en un mecanismo de penalización para decidir si se utiliza notación científica o no.

Formato dólar

Si tu eje representa dólares puedes utilizar la función label_dollar de forma que el eje se tratará como moneda y se agregará un símbolo de dolar como prefijo del número.

# install.packages("scales")
library(scales)

ggplot(cars, aes(x = speed, y = dist)) +
  geom_point() +
  scale_y_continuous(labels = label_dollar())

Etiquetas de los ejes con moneda dólar en ggplot2

Ejes con otras monedas (euros, pesos, yens …)

Si necesitas otra divisa, como euros, pesos o yenes, también puedes utilizar la función label_dollar, pero tendrás que especificar el símbolo de la moneda que quieras en los argumentos suffix o prefix. Ten en cuenta que por defecto, prefix = "$".

# install.packages("scales")
library(scales)

ggplot(cars, aes(x = speed, y = dist)) +
  geom_point() +
  scale_y_continuous(labels = label_dollar(suffix = "€", prefix = ""))

Ejes con una divisa (euro, yens, pesos) en ggplot2

Otras escalas que cabe mencionar de scales son label_bytes, label_date, label_date_short, label_math, label_percent, label_pvalue o label_scientific, entre otras.

Escala logarítmica en base 10

ggplot2 también proporciona algunas funciones para transformar la escala de los ejes, como scale_y_log10 o scale_x_log10 que convertirán el eje a escala logarítmica.

ggplot(cars, aes(x = speed, y = dist)) +
  geom_point() +
  scale_y_log10()

Ejes de ggplot2 con escala logarítimica con scale_y_log10

Escala raíz cuadrada

Las funciones scale_y_sqrt y scale_x_sqrt transformarán el eje correspondiente aplicando la raíz cuadrada a sus valores.

ggplot(cars, aes(x = speed, y = dist)) +
  geom_point() + 
  scale_y_sqrt()

Aplicar la raíz cuadrada a un eje en ggplot2 con scale_y_sqrt

Escala invertida

Las funciones scale_y_reverse y scale_x_reverse invertirán los ejes Y y X, respectivamente.

ggplot(cars, aes(x = speed, y = dist)) +
  geom_point() + 
  scale_y_reverse()

Escala invertida en ggplot2 con scale_y_reverse

Estilo de las líneas de los ejes

Agregar líneas a los ejes en ggplot2

El tema por defecto de ggplot2 no muestra las líneas de los ejes, pero si estás utilizando otro tema o quieres agregar las líneas de los ejes puedes pasar un element_line al componente axis.line de la función theme. Luego, podrás establecer el grosor, color, tipo de línea, etc, o dejar los argumentos por defecto.

p + 
  theme(axis.line = element_line(color = "red",
                                 linewidth = 1.5,
                                 linetype = 2))

Color, grosor y tipo de línea de los ejes en ggplot2

Recuerda que si quieres establecer o personalizar solo uno de los ejes tendrás que agregar .x o .y al componente axis.line para personalizar la línea del eje X o del eje Y, respectivamente.

p + 
  theme(axis.line.x = element_line(color = "blue",
                                   linewidth = 1.5,
                                   linetype = 3))

Gráfico de ggplot2 con flechas en los axes

Agregar flechas a las líneas de los ejes

Añade flechas a los ejes pasando la función arrow al argumento arrow de la función element_line. Puedes personalizar el ángulo, el tamaño, la posición ("last", por defecto, "first" o "both") y el tipo de flecha ("open", por defecto o "closed").

p + 
  theme(axis.line = element_line(arrow = arrow(angle = 30,
                                               length = unit(0.15, "inches"),
                                               ends = "last", 
                                               type = "closed")))

Eje secundario (dos ejes)

Es posible crear un gráfico en ggplot2 con eje dual o eje secundario con el argumento sec.axis de scale_(x|y)_continuous y la función sec_axis. Esta función requiere de una fórmula o función de transformación y el nombre del nuevo eje.

ggplot(cars, aes(x = speed, y = dist)) +
  geom_col() +
  geom_smooth(data = cars, aes(x = speed, y = dist * 2)) + 
  scale_y_continuous(sec.axis = sec_axis(trans = ~.* 2, name = "Título del eje Z"))

Eje dual en ggplot2 con sec.axis

Número de cortes en los ejes

La función también proporciona el argumento breaks para personalizar el número de cortes en los ejes del eje secundario. En el ejemplo siguiente estamos pasando solo tres cortes.

ggplot(cars, aes(x = speed, y = dist)) +
  geom_col() +
  geom_smooth(data = cars, aes(x = speed, y = dist * 2)) + 
  scale_y_continuous(sec.axis = sec_axis(~.* 2, name = "Título del eje Z",
                                         breaks = c(100, 200, 300)))

Eje secundario en ggplot2

Etiquetas del eje secundario

Las etiquetas del eje dual se pueden cambiar a través del argumento labels. Recuerda que la longitud del vector pasado a breaks debe ser igual que el de labels.

ggplot(cars, aes(x = speed, y = dist)) +
  geom_col() +
  geom_smooth(data = cars, aes(x = speed, y = dist * 2)) + 
  scale_y_continuous(sec.axis = sec_axis(~.* 2, name = "Título del eje Z",
                                         breaks = c(100, 200, 300),
                                         labels = c("A", "B", "C")))

Etiquetas del eje secundario de ggplot2

Personalización avanzada del eje secundario

El eje derecho se puede modificar haciendo uso de los componentes correspondientes. Con axis.title.y.right puedes cambiar el estilo del título del eje, como su color o tamaño, con axis.text.y.right puedes personalizar el color y tamaño de las etiquetas de los ejes y con axis.line.y.right puedes modificar la línea del eje.

ggplot(cars, aes(x = speed, y = dist)) +
  geom_col() +
  geom_smooth(data = cars, aes(x = speed, y = dist * 2)) + 
  scale_y_continuous(sec.axis = sec_axis(~.* 2, name = "Título del eje Z")) + 
  theme(axis.title.y.right = element_text(color = "red", 
                                          size = 15,
                                          face = "bold"),
        axis.text.y.right = element_text(color = "blue", size = 10),
        axis.line.y.right = element_line(color = "orange"))

Personalizar los textos y líneas del eje derecho de ggplot2

También te puede interesar