Calendarios en matplotlib con calplot

Librería

calplot

Autor principal

Tom Kwok

Datos de muestra

Considera los siguientes datos de muestra para este tutorial, donde cada día entre el 01-01-2020 y el 30-06-2023 viene representado por un único valor.

import numpy as np; np.random.seed(1)
import pandas as pd

# Secuencia de fechas
dias = pd.date_range('01/01/2020', periods = 1277, freq = 'D')

# Serie temporal de pandas con dato aleatorios para cada día
valores = pd.Series(np.random.randn(len(dias)), index = dias)

Calendarios como mapas de calor con calplot

En Python la librería calplot permite crear calendarios en los que cada día se colorea en base a su correspondiente valor, creando así mapas de calor. Esta librería nace a partir de la librería calmap, la cual ya no tiene mantenimiento activo, proporcionando además una personalización más sencilla y nuevas características.

Para crear el calendario tan solo necesitas pasar tu serie de pandas con datos para cada día a la función calplot y se dibujarán tantos años como haya en tus datos. Ten en cuenta que el argumento suptitle se puede utilizar para agreagar un título a la figura y además se puede personalizar pasando un diccionario a suptitle_kws.

import calplot
import matplotlib.pyplot as plt

calplot.calplot(valores,
                suptitle = 'Calendario',
                suptitle_kws = {'x': 0.5, 'y': 1.0})
# plt.show()

Calendario en Python

Años en orden descendente

Por defecto, los años se presentan en orden ascendente, pero puedes invertir el orden con yearascending = False.

import calplot
import matplotlib.pyplot as plt

calplot.calplot(valores, yearascending = False,
                suptitle = 'Calendario con años en orden descendente', 
                suptitle_kws = {'x': 0.5, 'y': 1.0})
# plt.show()

Calendario de matplotlib calendar con años en orden descendente

Crear un calendario de solo un año

Si quieres especificar un único año puedes usar la función yearplot y pasar el año al argumento year. Sin embargo, recomendamos utilizar la función calplot y filtrar tus datos, ya que calplot es un wrapper de yearplot y el gráfico final es más personalizable.

import calplot
import matplotlib.pyplot as plt

# Con calplot (recomendado):
calplot.calplot(valores.loc['2021'])

# Con yearplot:
calplot.yearplot(valores, year = 2021)

# plt.show()

Calendario de contribuciones en Python basado en matplotlib

Eliminar la leyenda

Ten en cuenta que si quieres puedes eliminar la leyenda estableciendo colorbar = False.

import calplot
import matplotlib.pyplot as plt

calplot.calplot(valores, colorbar = False)
# plt.show()

Calendario hecho con la librería calplot sin leyenda

Colores

La paleta de colores por defecto del mapa de calor ('viridis') se puede personalizar con el argumento cmap. En los siguientes ejemplos de esta sección utilizaremos la paleta de colores llamada 'Spectral_r'.

import calplot
import matplotlib.pyplot as plt

calplot.calplot(valores, cmap = 'Spectral_r')
# plt.show()

Personalizar la paleta de colores del calendario de Python

Color de los datos faltantes

Si tus datos contienen datos faltantes se colorearán en gris claro con los ajustes predefinidos. Sin embargo, puedes personalizar el color usando el argumento fillcolor.

import calplot
import matplotlib.pyplot as plt

calplot.calplot(valores, fillcolor = 'orange', cmap = 'Spectral_r')
# plt.show()

Color de las celdas del calendario de Python sin datos

Color de las líneas que dividen los meses

Las líneas que dividen cada mes son grises por defecto, pero puedes personalizar su color con el argumento edgecolor, tal y como se muestra en el ejemplo siguiente.

import calplot
import matplotlib.pyplot as plt

calplot.calplot(valores, edgecolor = 'black', cmap = 'Spectral_r')
# plt.show()

Color de las líneas de los meses en calplot

Color de las líneas que dividen los días

El color de las líneas que dividen cada día se puede establecer a través del argumento linecolor. Además, el argumento linewidth, que por defecto es 1, permite personalizar el grosor de dichas líneas.

import calplot
import matplotlib.pyplot as plt

calplot.calplot(valores, linecolor = 'green', linewidth = 1,
                cmap = 'Spectral_r')
# plt.show()

Color de las líneas del calendario mapa de calor hecho en Python

Etiquetas

Etiquetas de los días

Las etiquetas por defecto de los días son los nombres abreviados de los días de la semana en inglés. Puedes personalizar estas etiquetas pasando una lista al argumento daylabels de la función. Además, también puedes eliminar algunas etiquetas de los días con dayticks, pasando una lista de enteros especificando qué días etiquetar.

import calplot
import matplotlib.pyplot as plt

calplot.calplot(valores, cmap = 'RdBu',
                daylabels = ['Lunes', 'Martes', 'Miércoles', 
                             'Jueves', 'Viernes', 'Sábado', 'Domingo'])
# plt.show()

Etiquetas de los días del calendario de matplotlib

Etiquetas de los meses

De manera análoga a los nombres de los días, también puedes personalizar las etiquetas de los meses, pero en este caso con los argumentos monthlabels y monthticks de la función calplot.

import calplot
import matplotlib.pyplot as plt

calplot.calplot(valores, cmap = 'RdBu',
                monthlabels = ['Enero', 'Febrero', 'Marzo', 
                               'Abril', 'Mayo', 'Junio',
                               'Julio', 'Agosto', 'Septiembre',
                               'Octubre', 'Noviembre', 'Diciembre'])
# plt.show()

Etiquetas de los meses del calendario de Python

Etiquetas de los años

Las etiquetas que aparecen a la izquierda mostrando los años se pueden eliminar con yearlabels = False. A su vez, también puedes personalizar su tamaño, color u otras propiedades de los textos pasando un diccionario a yearlabel_kws.

import calplot
import matplotlib.pyplot as plt

calplot.calplot(valores, cmap = 'RdBu',
                yearlabels = True,
                yearlabel_kws = {'fontsize': 15, 'color': 'red'})
# plt.show()

Personalizar las etiquetas de los años del calendario hecho con Python

Etiquetas de las celdas

Por último, ten en cuenta que también puedes agregar los valores correspondientes a cada día especificando un formato con textformat. Recuerda es posible especificar un texto para las celdas que no tienen datos, así como cambiar el color de los textos con textcolor.

import calplot
import matplotlib.pyplot as plt

calplot.calplot(valores, cmap = 'RdBu',
                textformat = '{:.0f}', textfiller = '-', textcolor = 'black')
# plt.show()

Agregar etiquetas o textos a cada uno de los días del calendario de matplotlib

Fundamentals of Data Visualization

A Primer on Making Informative and Compelling Figures

Comprar en Amazon

También te puede interesar