Calendarios en R usando ggplot2

Creando calendarios en ggplot2 con el paquete calendR

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

Calendario anual en R

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

Calendario en R con el paquete calendR

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

Comienzo de las semanas en lunes en el calendario

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

Añadir color a los días del calendario

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

Colorear los fines de semana del calendario basado en ggplot2

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 con varios eventos en R

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

Calendario vertical en R

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)

Calendario mensual en ggplot2

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

Agregar color a los días del calendario de R

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

Calendario en ggplot2 con varios eventos

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

Añadir texto a los días del calendario basado en ggplot2

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

Calendario lunar en R

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 con fechas personalizadas en R

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 académico en R

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

Calendario como mapa de calor

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

Calendario mensual en R, mapa de calor

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

Añadir leyenda al mapa de calor de calendario en ggplot2

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

Gráfico de calendario personalizado en R

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")

calendario con el paquete calendR

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

Calendario anual en R con 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)

GitHub Logo

Repositorio del calendR

@R-CoderDotCom

Calendarios listos para imprimir con ggplot2