Cómo modificar los ejes tipo fecha en ggplot

Trabajar con variables de tipo fecha es una de las tareas más recurrentes en el manejo de datos. Son variables muy comunes que pueden aparecer de mil maneras diferentes, por eso es interesante tener claro cómo trabajar con ellas a la hora de añadirlas en un gráfico. En este post hablaremos sobre cómo modificar el formato de los ejes tipo fecha en ggplot.
Datos
En primer lugar, cargamos el dataset con el vamos a trabajar. Se trata de un csv que contiene información sobre las películas y series de Netflix desde 2008. Incluye títulos, una breve descripción y la fecha de lanzamiento, entre otros. Nosotros nos centraremos concretamente en la fecha en la que las películas de Netflix fueron añadidas a la plataforma.
library(dplyr)
library(ggplot2)
library(knitr)
df <- read.csv('https://raw.githubusercontent.com/elartedeldato/datasets/main/netflix_titles.csv')
kable(head(df, 3))
show_id | type | title | director | cast | country | date_added | release_year | rating | duration | listed_in | description |
---|---|---|---|---|---|---|---|---|---|---|---|
s1 | TV Show | 3% | João Miguel, Bianca Comparato, Michel Gomes, Rodolfo Valente, Vaneza Oliveira, Rafael Lozano, Viviane Porto, Mel Fronckowiak, Sergio Mamberti, Zezé Motta, Celso Frateschi | Brazil | August 14, 2020 | 2020 | TV-MA | 4 Seasons | International TV Shows, TV Dramas, TV Sci-Fi & Fantasy | In a future where the elite inhabit an island paradise far from the crowded slums, you get one chance to join the 3% saved from squalor. | |
s2 | Movie | 7:19 | Jorge Michel Grau | Demián Bichir, Héctor Bonilla, Oscar Serrano, Azalia Ortiz, Octavio Michel, Carmen Beato | Mexico | December 23, 2016 | 2016 | TV-MA | 93 min | Dramas, International Movies | After a devastating earthquake hits Mexico City, trapped survivors from all walks of life wait to be rescued while trying desperately to stay alive. |
s3 | Movie | 23:59 | Gilbert Chan | Tedd Chan, Stella Chung, Henley Hii, Lawrence Koh, Tommy Kuan, Josh Lai, Mark Lee, Susan Leong, Benjamin Lim | Singapore | December 20, 2018 | 2011 | R | 78 min | Horror Movies, International Movies | When an army recruit is found dead, his fellow soldiers are forced to confront a terrifying secret that’s haunting their jungle island training camp. |
df %>%
filter(type == 'Movie') %>%
group_by(date_added) %>%
count() -> df_netflix_movies
En primer lugar, la variable date_added es de tipo character, por lo que debemos convertirla a formato fecha, date. Para ello recurrimos a la función as.Date()
y especificamos el formato en el que aparece en el dataset, '%B %d, %Y'
.
Si no sabes cómo especificar un formato fecha en R, puedes consultarlo aquí.
head(df_netflix_movies$date_added)
## [1] "April 1, 2016" "April 1, 2017" "April 1, 2018" "April 1, 2019"
## [5] "April 1, 2020" "April 10, 2017"
df_netflix_movies$date_added <- as.Date(df_netflix_movies$date_added, format='%B %d, %Y')
head(df_netflix_movies$date_added)
## [1] "2016-04-01" "2017-04-01" "2018-04-01" "2019-04-01" "2020-04-01"
## [6] "2017-04-10"
Gráfico mensual en ggplot
A continuación, agrupamos la información mensualmente utilizando format()
y realizamos un gráfico de líneas en ggplot con geom_line()
.
df_netflix_movies$month <- as.Date(format(df_netflix_movies$date_added, '%Y-%m-01'))
df_netflix_movies %>%
filter(month<'2021-01-01', month>='2020-01-01') %>%
group_by(month) %>%
summarise(n:=sum(n)) %>%
ggplot(aes(month, n)) +
geom_line(color='red') +
geom_point(color='red') +
labs(title='Netflix 2020',
subtitle='Total de películas añadidas a la plataforma durante el año 2020',
x='', y='') +
theme(panel.grid = element_blank(),
text=element_text(family='BebasNeue-Regular'),
panel.grid.major.y = element_line(size=0.05, color='white'),
panel.background = element_rect(fill='black'),
plot.background = element_rect(fill='black', color='black'),
axis.text = element_text(color='white'),
panel.border = element_blank(),
plot.title = element_text(family='BebasNeue-Regular', color='red',size=30),
plot.subtitle = element_text(family='BebasNeue-Regular', color='red',size=15)) -> p
p
Cómo modificar los breaks del eje x
Una vez realizado el gráfico base, revisamos los breaks de los ejes. Como vemos, el eje x consta de cuatro cortes, cuando tal vez tendría más sentido que las marcas fueran mes a mes.
Para modificar los breaks del eje tipo fecha, se emplea el argumento date_breaks
.
Este argumento se puede indicar en lenguaje natural la distancia temporal entre marcas del eje como 2 months
o 1 year
, eso sí, en inglés.
p + scale_x_date(date_breaks='1 month')
Cómo cambiar el formato fecha el eje x
Por defecto, el formato de la fecha es el nombre abreviado del mes y el año, y al modificar los breaks, la fecha con el formato orginal en el dataset. Entonces, si quisiéramos modificar el formato del eje, aplicamos la función scale_x_date()
especificando en el argumento date_labels
el formato que deseamos.
Por ejemplo, para añadir el formato Mes/Año, tal que mm/yyyy
:
p + scale_x_date(date_labels = "%m/%Y", date_breaks='1 month')
Otra opción, sería indicar el nombre del mes completo y año, véase "%B %Y"
.
p + scale_x_date(date_labels = "%B %Y", date_breaks='1 month')
Si se solapan los nombres y creemos conveniente mantener los breaks de forma mensual, no hay problema. En ggplot, se puede evitar el solapamiento con guide = guide_axis(n.dodge = 2)
.
p + scale_x_date(date_labels = "%B %Y", date_breaks='1 month', guide = guide_axis(n.dodge = 2))
Conclusiones
- Modificamos el formato fecha con el argumento
date_labels
de la funciónscale_x_date()
. - Los breaks se pueden cambiar en lenguaje natural con el argumento
date_breaks
. - Para evitar el solapamiento del texto en el eje,
guide = guide_axis(n.dodge = ...)
.
Más info: https://ggplot2.tidyverse.org/reference/scale_date.html