Calendarios en R usando ggplot2
El paquete calendR permite crear calendarios basados en ggplot2 totalmente personalizables con una sola función. Además, la función incluye argumentos para crear mapas de calor con calendarios. En este tutorial, aprenderás a crear calendarios anuales y mensuales listos para imprimir en R.
Calendario anual en R
El paquete es muy sencillo de usar, ya que solo contiene una función llamada igual que el propio paquete, calendR
. De manera predeterminada, si no se especifica ningún argumento, la función creará el calendario del año actual en formato horizontal y todos los textos estarán en el idioma de tu sistema.
# install.packages("calendR")
library(calendR)
calendR() # Por defecto crea el calendario del año en curso
Si no quieres que los calendarios estén en el idioma de tu sistema operativo, puedes modificarlo. Por ejemplo, si quieres que los calendarios estén en inglés, puedes escribir: Sys.setlocale("LC_ALL", "English")
antes de ejecutar la función calendR
.
Para obtener el calendario anual en R de cualquier otro año puedes utilizar el argumento year
de la siguiente manera:
calendR(year = 2021) # Especifica el año deseado
En las siguientes subsecciones vamos a discutir cómo comenzar las semanas el domingo o lunes y cómo agregar un color a ciertos días.
Ten en cuenta que las funcionalidades descritas a continuación también están disponibles para los calendarios mensuales, pero la exposición de estas solo se realizará en esta sección para evitar repetir el mismo contenido.
Comienzo de las semanas
Las semanas empezarán en domingo por defecto. Si lo prefieres puedes establecer el argumento start
como "M"
para obtener un calendario donde la semana empieza en lunes en lugar de en domingo.
calendR(year = 2021,
start = "M") # Comienzo de las semanas en lunes
Coloreando los días del calendario
El argumento special.days
de la función permite añadir color a los días especificados dentro de un vector numérico. El color será aquel especificado en el argumento special.col
. Ten en cuenta que debes especificar el día del año correspondiente (de 1 a 365 o 366).
calendR(year = 2025,
start = "M",
special.days = c(9, 19, 56, 79, 102, # Días para colorear
126, 257, 300, 342),
special.col = "lightblue", # Color de los días especificados
low.col = "white") # Color de fondo del resto de días
Si lo que quieres es resaltar todos los fines de semana en tus calendarios puedes configurar el argumento special.days
como "weekend"
. Este atajo los coloreará todos a la vez.
calendR(year = 2025,
start = "M",
special.days = "weekend") # Colorear los fines de semana
Para agregar varios eventos debes crear un vector de NA
de la misma longitud que el número de días que tenga el año del que se vaya a crear el calendario. A continuación se pueden añadir los eventos a los días correspondientes del año en el vector, que será pasado al argumento special.days
. Ten en cuenta que debes especificar tantos colores como números de eventos haya.
# Vector de NA de la misma longitud que número de días del año
eventos <- rep(NA, 365)
# Establecemos los eventos en los días correspondientes
eventos[252] <- "Cumpleaños"
eventos[c(1:5, 359:365)] <- "Vacaciones Navidad"
eventos[213:228] <- "Vacaciones verano"
# Creamos el calendario con una leyenda
calendR(year = 2025,
special.days = eventos,
special.col = c("pink", "lightblue", "lightgreen"), # Colores
legend.pos = "right", # Leyenda a la derecha
legend.title = "") # Título de la leyenda
Calendario anual vertical
Cabe mencionar que también puedes crear calendarios anuales en R en modo vertical. Para ello, deberás establecer el argumento orientation
como "portrait"
o como "p"
. Esta configuración dará lugar a un calendario de tres columnas en lugar de cuatro.
calendR(orientation = "portrait", # Equivalente a: orientation = "p"
months.pos = 0) # Nombres de los meses a la izquierda
Calendarios mensuales en R
Las funcionalidades descritas anteriormente del calendario anual también están disponibles para los calendarios mensuales. No obstante, los calendarios mensuales también permiten agregar texto a los días del mes si se desea.
Para crear un calendario mensual, deberás especificar tanto el año como el mes de la siguiente manera:
calendR(year = 2021, month = 8)
Añadiendo colores a los días
Como discutimos en la sección anterior, puedes agregar un color en los días especificados en el argumento special.days
.
Por una parte, para un solo evento los días con color serán aquellos especificados en el argumento special.days
y el color será el elegido con el argumento special.col
. También puedes especificar special.days = "weekend"
para colorear todos los fines de semana.
calendR(year = 2021, month = 8,
special.days = c(1, 9, 12, 23, 28), # Días con color
special.col = "#bfe2f2", # Color de los eventos
low.col = "white") # Color del resto de días
Por otra parte, para agregar más de un evento al calendario de R deberás crear un vector de NA
del mismo tamaño que el número de días del mes que quieras dibujar y especificar determinados eventos en los días correspondientes. En el siguiente ejemplo mostramos cómo agregar varios eventos, incluidos fines de semana, y cómo agregar una leyenda.
# Vector de fechas
fechas <- seq(as.Date("2020-08-01"), as.Date("2020-08-31"), by = "1 day")
# Creamos un vector de NA y fines de semana
# (teniendo en cuenta que la semana empezará en lunes)
eventos <- ifelse(format(fechas, "%w") %in% c(5, 6), "Fin de semana", NA)
# Añadimos más eventos
eventos[c(3, 5, 10, 12, 17, 19, 24, 26)] <- "Academia"
eventos[c(13, 27)] <- "Natación"
eventos[30] <- "Examen"
# Creamos el calendario en R
calendR(year = 2021, month = 8,
start = "M",
special.days = eventos,
special.col = c("lightgreen", "pink", # Tantos colores
"#f7f7f7", "#bfe2f2"), # como número de eventos
low.col = "white",
legend.pos = "bottom", # Posición de la leyenda
legend.title = "") # Título de la leyenda
Agregar texto a los días
Al trabajar con calendarios mensuales, también puedes agregar texto a los días con el argumento text
y especificar su posición (los días) con el argumento text.pos
. Ten en cuenta que puedes modificar el tamaño y el color de los textos con los argumentos text.size
y text.col
, respectivamente.
calendR(year = 2021, month = 8, # Año y mes
start = "M", # Empezar la semana en lunes
text = c("Deporte", "Deporte", # Añadir texto
"Clase"), # (solo para los calendarios mensuales)
text.pos = c(5, 16, 25), # Días en los que poner los textos
text.size = 4.5, # Tamaño de fuente de los textos
text.col = 4) # Color de los textos
Puedes agregar más texto al mismo día separando el texto con "\n"
. E.g.: text = "Running\nNatación"
.
Calendario lunar en ggplot2
Al crear un calendario mensual también puedes agregar las fases lunares a los días. Para ello establece lunar = TRUE
y modifica el tamaño de las lunas con el argumento lunar.size
. También puedes modificar el color del área no visible de la luna con el argumento lunar.col
.
calendR(month = 2,
lunar = TRUE, # Añade lunas al calendario mensual
lunar.col = "gray60", # Color del área no visible de las lunas
lunar.size = 7) # Tamaño de las lunas
Fechas de inicio y fin personalizadas
Si en lugar de establecer los argumentos year
y month
estableces start_date
y end_date
podrás personalizar la fecha de inicio y de fin de los calendarios. Este tipo de calendarios tiene las mismas funcionalidades que los calendarios anuales, aunque se especifique solo un mes.
calendR(start_date = "2023-10-01", # Fecha de inicio personalizada
end_date = "2024-05-31") # Fecha de fin personalizada
Calendario académico
Los argumentos start_date
y end_date
son especialmente útiles para realizar calendarios académicos. Por ejemplo:
calendR(start_date = "2020-09-01", # Fecha de inicio personalizada
end_date = "2021-05-31", # Fecha de fin personalizada
start = "M", # Comienzo de la semana en lunes
mbg.col = 4, # Color de fondo del nombre de los meses
months.col = "white", # Color del texto del nombre de los meses
special.days = "weekend", # Colorea los fines de semana
special.col = "lightblue", # Color de los special.days
lty = 0, # Tipo de linea
bg.col = "#f4f4f4", # Color de fondo
title = "Calendario académico 2020-2021", # Título
title.size = 30, # Tamaño del título
orientation = "p") # Orientación vertical
Calendario como mapa de calor en R
Además, la función del paquete calendR
permite crear mapas de calor a partir de los calendarios, estableciendo el argumento gradient
como TRUE
y especificando un vector de la longitud del número de días del año o mes correspondiente en el argumento special.days
.
Cabe mencionar que el color especificado en special.col
se usará como el color más alto del degradado, mientras que el más bajo se establecerá con el argumento low.col
, que por defecto es "white"
.
calendR(year = 2021,
special.days = 1:365, # Vector de la misma longitud que el número de días del año
gradient = TRUE, # Establece gradient = TRUE para crear el mapa de calor
special.col = rgb(1, 0, 0, alpha = 0.6), # Color del degradado para los valores más altos
low.col = "white") # Color del degradado para los valores más bajos
Puedes hacer lo mismo con un calendario mensual:
set.seed(2)
calendR(year = 2020,
month = 5,
special.days = rnorm(31), # Vector de la misma longitud que el número de días del mes
gradient = TRUE, # Establece gradient = TRUE para crear un mapa de calor
special.col = "lightblue", # Color del degradado para los valores más altos
low.col = "white") # Color del degradado para los valores más bajos
Además, puedes agregar una leyenda a los mapas de calor del calendario anual y mensual estableciendo la posición de la leyenda con el argumento legend.pos
. Ten en cuenta que también puedes especificar un título de leyenda con el argumento legend.title
.
set.seed(2)
calendR(year = 2021,
month = 6,
special.days = rnorm(30),
gradient = TRUE,
special.col = "lightblue",
legend.pos = "right", # Posición de la leyenda (también "none", "top", "bottom" o "left")
legend.title = "Leyenda") # Título de la leyenda
Personalización adicional de los calendarios
Existe una amplia variedad de argumentos que puedes modificar para personalizar la salida resultante. En esta sección vamos a revisar algunos ejemplos personalizados para aprender a personalizar cada argumento. En el siguiente bloque de código mostramos un ejemplo simple:
calendR(year = 2020, # Año
month = 10, # Mes
start = "S", # Comienzo de la semana ("S": domingo, "M": lunes)
title = "Mi calendario", # Cambiar el título
title.size = 30, # Tamaño de fuente del título
title.col = 2, # Color del título
subtitle = "Ten unnbuen día", # Añadir subtítulo
subtitle.col = 3, # Color del subtítulo
weeknames = c("D", "L", "M", "X", # Cambiar el nombre de los días
"J", "V", "S"),
special.days = "weekend", # Colorear los fines de semana (también se puede poner un vector de días)
special.col = rgb(0, 0, 1, 0.15), # Color de los días especiales
col = "#f2f2f2", # Color de las líneas del calendario
lwd = 1, # Ancho de las líneas del calendario
lty = 1, # Tipo de línea del calendario
font.family = "mono", # Fuente de todos los textos
font.style = "bold", # Estilo de todos los textos, excepto del subtítulo
weeknames.col = "gray30", # Color de los nombres de los días de la semana
months.col = "gray30", # Si month = NULL, es el color del nombre de los meses
days.col = 4, # Color del número de días
day.size = 3.5, # Tamaño del número de días
bg.img = "") # Imagen de fondo
A continuación creamos otro calendario más elaborado, con colores oscuros:
calendR(month = 10, # Mes
start = "M", # La semana empieza en lunes
orientation = "landscape", # Orientación horizontal
# Tamaño y color del título
title.size = 40,
title.col = "white",
# Subtítulo, color y tamaño del mismo
subtitle = "Puedes quejarte o quejarte y arreglarlo",
subtitle.col = "white",
subtitle.size = 16,
# Texto, color, tamaño y posición
text = "Halloween",
text.col = "red",
text.size = 5,
text.pos = 31,
# Colorear los fines de semana de gris
special.days = "weekend",
special.col = "grey40",
# Color de las líneas, del fondo y
# de los días
col = "white",
bg.col = "grey20",
low.col = "transparent", # El mismo color que el fondo
# Color y tamaño de los números de los días
days.col = "white",
day.size = 4,
# Fases de la luna y tamaño de las lunas
lunar = TRUE,
lunar.size = 8,
# Color y tamaño del nombre de los días de la semana
weeknames.col = "white",
weeknames.size = 6,
# Ancho y tipo de líneas
lwd = 0.25,
lty = 1,
# Tipografía y estilo de fuente
font.family = "sans",
font.style = "plain")
Por último, vamos a crear un calendario anual en R con una imagen de fondo:
# Imagen de fondo (puede ser un enlace o una imagen local)
# Si es una imagen local debe estar en el directorio de trabajo
# o en otro caso se debe indicar la ruta completa de la imagen
img <- "https://i.pinimg.com/originals/10/1e/f6/101ef6a9e146b23de28fa2cd568ad17b.jpg"
calendR(start = "M", # Las semanas empiezan en lunes
mbg.col = 4, # Color de fondo del nombre de los meses
months.col = "white", # Color del texto de los nombres de los meses
special.days = "weekend", # Colorea los fines de semana
special.col = "lightblue", # Color de los special.days
lty = 0, # Tipo de línea (sin línea)
weeknames = c("Lu", "Ma", # Nombres de los días de la semana
"Mi", "Ju",
"Vi", "Sa",
"Do"),
title.size = 40, # Tamaño del título
orientation = "p", # Orientación vertical
bg.img = img) # Imagen de fondo
Guardando los calendarios en PDF
Finalmente, puedes establecer el argumento pdf
como TRUE
para guardar los calendarios en un PDF (por defecto formato A4) listo para imprimir.
También puedes especificar el nombre del archivo PDF generado en el argumento doc_name
, pero si no se especifica, el nombre del archivo tendrá el formato: Calendar_year.pdf
para calendarios anuales, Calendar_month_year.pdf
para calendarios mensuales o Calendar_start_date_end_date.pdf
. Como ejemplo, puedes guardar el calendario anual de cuatro columnas en R con el código siguiente:
calendR(year = 2021,
orientation = "landscape", # Establece orientation = "portrait" para un calendario de 3 columnas
pdf = TRUE,
doc_name = "mi_calendario") # Nombre del PDF (sin escribir la extensión)
También puedes elegir el tamaño del papel en el que quieres que se guarde el documento, desde "A6"
hasta "A0"
, pero ten en cuenta que es probable que tengas que ajustar algunos tamaños de fuente para que el resultado sea el esperado.
calendR(year = 2021,
orientation = "landscape",
pdf = TRUE,
papersize = "A6") # Elige el tamaño del papel
Por último, observa que si se establece la orientación "portrait"
para un calendario mensual, el calendario se mostrará igual que en modo "landscape"
en la ventana gráfica, pero se guardará en modo vertical en el PDF.
calendR(year = 2021,
month = 1,
orientation = "portrait",
pdf = TRUE)