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
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()
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
.
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")
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")
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"))
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"))
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 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())
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.
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.
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)
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))
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))
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 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"))
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))
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())
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
.
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.
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))
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))
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"))
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)
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)
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())
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())
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 = ""))
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()
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()
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()
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))
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))
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")))
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"))
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)))
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")))
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"))
También te puede interesar