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ón scale_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

Paula L. Casado
Paula L. Casado
Data Scientist

Científica de datos especializada en visualización de datos.

Relacionado