InicioGr谩ficosCalendarios en R usando ggplot2

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
Aladir texto a los d铆as del calendario basado en ggplot2
Puedes agregar m谩s texto al mismo d铆a separando el texto con "\n". Eg: 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 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 un\nbuen 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, n贸tese 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