Cómo añadir una anotación en ggplot

Llegamos al día 21 del Calendario de Adviento especial ggplot. Ya queda menos para terminar y hemos querido reservar lo mejor para el final! De aquí en adelante hablaremos sobre edición avanzada de texto en ggplot y un último post más especial sobre cómo añadir animación a un gráfico en ggplot.
Hoy en concreto vamos a aprender cómo añadir una anotación en una visualización de ggplot. ¡Empezamos!
Datos de Netflix
Como primer paso, cargaremos los datos que ya hemos utilizado en el post sobre cómo cambiar el estilo de las etiquetas de los ejes en ggplot. Se trata de un dataset de Kaggle que contiene todos los metadatos de las películas y series de Netflix hasta el mes de Enero de 2021.
Cargamos también la librería de tidyverse
, que incluye ggplot2
y dplyr
, así como la librería lubridate
, para manipular fechas fácilmente.
library(tidyverse)
library(lubridate)
df <- read.csv('https://raw.githubusercontent.com/elartedeldato/datasets/main/netflix_titles.csv')
df %>%
filter(str_detect(description, 'high school')) %>%
mutate(year_added:=year(mdy(date_added))) %>%
filter(!is.na(year_added)) %>%
group_by(year_added) %>%
count() -> df_year
Para el gráfico de este post, hemos seleccionado el total de películas o shows de instituto por año, filtrando en la descripción del programa ‘high school’.
Gráfico de barras en ggplot
ggplot(df_year) +
geom_col(aes(x=year_added, y=n), fill='red') +
scale_x_continuous(breaks=df_year$year_added) +
theme_bw() +
theme(legend.position= 'none',
axis.title= element_blank(),
axis.text = element_text(family='PermanentMarker-Regular', size=10, color='white'),
axis.ticks = element_blank(),
panel.grid = element_blank(),
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'),
panel.border = element_blank(),
plot.title = element_text(family='BebasNeue-Regular', color='red',size=45, margin=margin(15,0,5,0)),
plot.subtitle = element_text(family='PermanentMarker-Regular', size=10, color='white'),
plot.caption = element_text(family='PermanentMarker-Regular', color='white',size=7, margin=margin(30,0,0,0))) +
labs(title='Netflix',
subtitle='Películas y series de Instituto',
caption = "Fuente: Kaggle") -> p
p
En esta visualización hemos empleado conocimientos de ggplot ya vistos en posts anteriores:
- Realizamos un gráfico en ggplot con
geom_col(...)
- Modificamos los breaks de los ejes con
scale_x_continuous(breaks=...)
- Cambiamos el tema por defecto al
theme_bw()
- Eliminamos la leyenda con
theme(legend.position= 'none')
- Modificamos otros aspecto del tema de ggplot con
theme(...)
- Añadimos título, subtítulo y pie de gráfico con
labs(title=..., subtitle=..., caption=...)
Añadir una anotación
A continuación, remarcaremos que los datos “llegan” hasta enero de 2021, motivo por el cual la última barra del plot es más corta que las anteriores y no sigue la misma tendencia. Para ello, añadimos una anotación de texto sobre el gráfico indicando que se trata sólo de dicho mes.
En ggplot, se emplea la función annotate('text')
, donde el argumento label
definirá exactamente el texto a añadir.
p + annotate('text', label='Enero',
x=2021, y=10, hjust=0.5, vjust=0, family='PermanentMarker-Regular', size=4, color='white')
Si nos fijamos, las coordenadas x
e y
definen la posición en el panel donde irá situada la anotación. Por otro lado, hjust
se refiere a la justificación horizontal del texto: a la izquierda, centrado o justificado a la derecha. Entonces, hjust=0.5
justifica el texto en el centro y vjust=0
lo justifica verticalmente en la parte superior. El resto de argumentos se refieren a la fuente, tamaño y color del texto respectivamente.
Girar una anotación
Aunque ya podríamos mantener así la anotación, parece que la tipografía y el estilo desenfadado de la visualización piden girar el texto y enlazarlo a la barra de alguna manera. En este punto veremos cómo girar una anotación y en el siguiente, cómo añadir una flecha de enlace y personalizarla.
Girar una anotación es muy sencillo, simplemente basta con especificar angle=45
, donde 45 son los grados del giro.
p + annotate('text', label='Enero',
x=2021, y=10, hjust=0.5, vjust=0, family='PermanentMarker-Regular', size=4, color='white', angle=45) -> p
p
Añadir una flecha como anotación
Ya por último, vamos a ver cómo añadir una flecha que enlace la anotación con la barra. Para ello, con la misma función annotate()
espcificamos 'curve'
y generará una curva en la posición del gráfico que le indiquemos.
p + annotate('curve', x=2021, y=9, xend=2021, yend=5, color='white')
Sin embargo, la curvatura no es la deseada. Para modificarla, empleamos el argumento curvature=-0.5
que invertirá la curva.
p + annotate('curve', x=2021, y=9, xend=2021, yend=5, color='white', curvature=-0.5)
Finalmente, si queremos que la línea termine en forma de flecha, debemos definir el argumento arrow
con la función arrow()
.
p + annotate('curve', x=2021, y=9, xend=2021, yend=5, color='white', curvature=-0.5, arrow = arrow(length = unit(0.03, "npc")))
En resumen…
- Añadir una anotación de texto con
annotate('text')
- Girar una anotación con
annotate(angle=...)
- Añadir una flecha como anotación con
annotate('curve', arrow = arrow(...), curvature=...)