Saltar al contenido principal
InicioTutorialesPython

Gráfico lineal de series temporales Matplotlib

Este tutorial explora cómo crear y personalizar gráficos de líneas de series temporales en matplotlib.
may 2024  · 8 min leer

Una serie temporal es una colección de observaciones de datos indexados por tiempo en orden cronológico. Estas observaciones de datos suelen registrarse (aunque no necesariamente) a intervalos de tiempo regulares. Las series temporales se utilizan a menudo en la banca, el comercio, el marketing, la ciencia y otros sectores. La representación visual más típica de los datos de series temporales es un gráfico de líneas en el que el tiempo se sitúa en el eje de abscisas y el valor medido, en el eje de ordenadas.

En este tutorial, exploraremos cómo crear y personalizar gráficos de líneas de series temporales en matplotlib, una biblioteca de gráficos primaria de Python.

Introducción al trazado de series temporales con matplotlib

Importación de bibliotecas y carga de datos

En primer lugar, importaremos las librerías Python necesarias y cargaremos los datos: un conjunto de datos de Kaggle Tipos de cambio diarios por euro 1999-2023. También realizaremos una limpieza básica de los datos:

import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
from datetime import datetime

df = pd.read_csv('euro-daily-hist_1999_2022.csv')
df = df.iloc[:, [0, 4, 28, -2]]
df.columns = ['Date', 'CAD', 'NZD', 'USD']

for col in ['CAD', 'NZD', 'USD']:
    df = df[df[col] != '-']
    df[col] = pd.to_numeric(df[col])
   
df = df[df['Date'] >= '2022-12-01'].reset_index(drop=True)
print(df.head(3))
print(f'\nThe date range: {df.Date.min()}/{ df.Date.max()}')

Salida:

Date     CAD     NZD     USD
0  2023-01-27  1.4479  1.6759  1.0865
1  2023-01-26  1.4568  1.6799  1.0895
2  2023-01-25  1.4544  1.6792  1.0878

The date range: 2022-12-01/2023-01-27

Conversión de cadenas de fecha/hora en objetos datetime

Para trabajar eficazmente con series temporales, necesitamos convertir cadenas de fecha u hora en objetos datetime utilizando la función pandas.to_datetime:

df['Date'] = pd.to_datetime(df['Date'])
print(df['Date'].dtypes)

Salida:

datetime64[ns]

Si necesitas un repaso sobre cómo trabajar con series temporales en Python, te puede resultar útil el curso Manipulating Time Series Data in Python.

Establecer una columna de fecha y hora como índice de un marco de datos

Ahora, vamos a establecer la columna Date como un índice de marco de datos utilizando el método set_index:

df = df.set_index('Date')
print(df.head(3))

Salida:

              CAD     NZD     USD
Date                             
2023-01-27  1.4479  1.6759  1.0865
2023-01-26  1.4568  1.6799  1.0895
2023-01-25  1.4544  1.6792  1.0878

Creación de un gráfico matplotlib básico de series temporales de una sola línea

Para crear un gráfico lineal básico de series temporales, utilizamos el método estándar matplotlib.pyplot.plot(x, y):

plt.plot(df.index, df['CAD'])

Salida:

image1.png

Creación de un gráfico de series temporales matplotlib de varias líneas

Para crear un gráfico de series temporales de varias líneas, basta con ejecutar el método matplotlib.pyplot.plot(x, y) el número de veces necesario:

plt.plot(df.index, df['CAD'])
plt.plot(df.index, df['NZD'])
plt.plot(df.index, df['USD'])

image4.png

El uso del bucle for optimiza el código anterior:

for col in ['CAD', 'NZD', 'USD']:
    plt.plot(df.index, df[col])

Salida: 

image4.png

Personalización de los gráficos de series temporales de matplotlib

Para que nuestro gráfico de líneas de series temporales sea más legible y atractivo, tenemos que personalizarlo. Podemos aplicarle algunos ajustes comunes de matplotlib, como personalizar el tamaño de la figura, añadir y personalizar un título para el gráfico y etiquetas para los ejes, modificar las propiedades de las líneas, añadir y personalizar marcadores, etc. Otros ajustes son específicos de los gráficos de líneas de series temporales, como personalizar las marcas de los ejes temporales y sus etiquetas o resaltar determinados periodos de tiempo.

Personalizar la figura y los ejes

Utilizando los métodos estándar de matplotlib, podemos personalizar la figura y los ejes de un gráfico lineal de series temporales de muchas maneras, como se describe en los comentarios de código a continuación:

# Adjusting the figure size
fig = plt.subplots(figsize=(16, 5))

# Creating a plot
plt.plot(df.index, df['CAD'])

# Adding a plot title and customizing its font size
plt.title('EUR-CAD rate', fontsize=20)

# Adding axis labels and customizing their font size
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)

# Rotaing axis ticks and customizing their font size
plt.xticks(rotation=30, fontsize=15)

# Changing the plot resolution - zooming in the period from 15.12.2022 till 15.01.2023
plt.xlim(pd.Timestamp('2022-12-15'), pd.Timestamp('2023-01-15'))

Salida: 

image8.png

Personalizar las propiedades de las líneas

Al igual que con los gráficos de líneas comunes, es posible cambiar las propiedades de línea de un gráfico de líneas de series temporales, como el color, el estilo o la anchura de la línea:

plt.plot(df.index, df['CAD'], color='green', linestyle='dashed', linewidth=3)

Salida:

image5.png

Añadir y personalizar marcadores

Como con cualquier gráfico de líneas, podemos poner marcadores en un gráfico de líneas de series temporales y personalizar su símbolo, color, color de borde y tamaño:

plt.plot(df.index, df['CAD'], marker='o', markerfacecolor='yellow', markeredgecolor='red', markersize=8)

image9.png

Personalización de los ticks del eje temporal

Primero vamos a crear un gráfico básico de matplotlib de series temporales con algunas personalizaciones esenciales:

fig = plt.subplots(figsize=(16, 5))
plt.plot(df.index, df['CAD'])
plt.title('EUR-CAD rate', fontsize=20)
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
plt.xlim(df.index.min(), df.index.max())

Salida: 

image7.png

Vemos que por defecto matplotlib muestra algunos ticks aleatorios, junto con sus etiquetas. Sin embargo, es posible que queramos controlar qué ticks se muestran en el eje temporal. En este caso, necesitamos proporcionar una lista de las fechas (u horas) necesarias como cadenas o pandas timestamps al método matplotlib.pyplot.xticks:

fig = plt.subplots(figsize=(16, 5))
plt.plot(df.index, df['CAD'])
plt.title('EUR-CAD rate', fontsize=20)
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
plt.xlim(df.index.min(), df.index.max())

# Defining and displaying time axis ticks
ticks = ['2022-12-05', '2023-01-02', '2023-01-20']
plt.xticks(ticks)

Salida: 

image6.png

Arriba, matplotlib mostraba las marcas seleccionadas y las etiquetaba automáticamente.

Si queremos mostrar todos los ticks, debemos proporcionar una lista de los índices de las series temporales al método matplotlib.pyplot.xticks método:

fig = plt.subplots(figsize=(16, 5))
plt.plot(df.index, df['CAD'])
plt.title('EUR-CAD rate', fontsize=20)
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
plt.xlim(df.index.min(), df.index.max())

# Defining and displaying all time axis ticks
ticks = list(df.index)
plt.xticks(ticks, rotation=45)

Salida: 

image2.png

Personalización de las etiquetas de los ejes temporales

Las etiquetas del eje temporal en el gráfico de líneas anterior pueden parecer abrumadoras. Es posible que queramos formatearlos para hacerlos más legibles. Para ello, podemos utilizar la clase matplotlib.dates.DateFormatter pasándole una cadena de formato strftime que refleje cómo queremos ver las fechas/horas. A continuación, proporcionamos este formateador al método matplotlib.axis.XAxis.set_major_formatter:

fig, ax = plt.subplots(figsize=(16, 5))
plt.plot(df.index, df['CAD'])
plt.title('EUR-CAD rate', fontsize=20)
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
plt.xlim(df.index.min(), df.index.max())
ticks = list(df.index)
plt.xticks(ticks, rotation=45)

# Formatting time axis tick labels
ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%b %d'))

Salida: 

image10.png

Esta página de documentación proporciona una lista exhaustiva de todos los posibles códigos de formato strftime.

Resaltar determinados periodos de tiempo

A veces, es posible que queramos sombrear determinados periodos de tiempo en un gráfico de líneas de series temporales. Para ello, podemos utilizar el método matplotlib.pyplot.axvspan. Requiere dos argumentos: los puntos de inicio y fin de un periodo de interés en formato fecha-hora. El método también puede tomar algunos parámetros opcionales para personalizar la apariencia de un área resaltada, como su color, el color del borde, la transparencia, el ancho de línea o el patrón de relleno.

Apliquemos esta técnica al gráfico de la sección anterior:

fig, ax = plt.subplots(figsize=(16, 5))
plt.plot(df.index, df['CAD'])
plt.title('EUR-CAD rate', fontsize=20)
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
plt.xlim(df.index.min(), df.index.max())
ticks = list(df.index)
plt.xticks(ticks, rotation=45)
ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%b %d'))

# Highlighting the time period from 15.12.2022 to 1.01.2023 and customizing the shaded area
plt.axvspan(datetime(2022, 12, 15), datetime(2023, 1, 1), facecolor='yellow', alpha=0.5, hatch='/', edgecolor='red', linewidth=5)

Salida: 

image11.png

Guardar un gráfico de series temporales matplotlib en un archivo

Podemos optar por guardar un gráfico de líneas de series temporales en un archivo de imagen en lugar de simplemente visualizarlo. Para ello, utilizamos el método matplotlib.pyplot.savefig pasando el nombre del archivo. Por ejemplo, volvamos a nuestra primera trama básica:

plt.plot(df.index, df['CAD'])

# Saving the resulting plot to a file
plt.savefig('time series line plot.png')

image1.png

Arriba, guardamos el gráfico en un archivo llamado gráfico de líneas de series temporales.png y ubicado en el mismo lugar que nuestro programa actual.

Conclusión

En resumen, en este tutorial hemos visto cómo crear y personalizar gráficos de líneas de series temporales en matplotlib, utilizando tanto métodos comunes de matplotlib como otros más avanzados, específicos sólo para visualizaciones de series temporales.

Después de aprender estas técnicas fundamentales, es posible que desee profundizar en el trabajo con datos de series temporales y su visualización en Python. En ese caso, considere la posibilidad de explorar los siguientes recursos completos, fáciles de usar para principiantes y de principio a fin:

Temas

Cursos de Python

Course

Introduction to Data Visualization with Matplotlib

4 hr
171.4K
Learn how to create, customize, and share data visualizations using Matplotlib.
See DetailsRight Arrow
Start Course
Ver másRight Arrow
Relacionado

blog

11 técnicas de visualización de datos para cada caso de uso con ejemplos

Descubra los análisis, técnicas y herramientas más populares para dominar el arte de la visualización de datos.
Javier Canales Luna's photo

Javier Canales Luna

16 min

tutorial

Cómo recortar una cadena en Python: Tres métodos diferentes

Aprenda los fundamentos del recorte de caracteres iniciales y finales de una cadena en Python.
Adel Nehme's photo

Adel Nehme

5 min

tutorial

Pandas Profiling (ydata-profiling) en Python: Guía para principiantes

Aprenda a utilizar la biblioteca ydata-profiling en Python para generar informes detallados de conjuntos de datos con muchas características.
Satyam Tripathi's photo

Satyam Tripathi

9 min

tutorial

Guía completa de listas vacías en Python

Aprenda las principales operaciones con listas y los casos de uso de las listas vacías en Python.
Adel Nehme's photo

Adel Nehme

5 min

tutorial

Tipos de gráficos de datos y cómo crearlos en Python

Explore varios tipos de gráficos de datos, desde los más comunes hasta los más avanzados y poco convencionales, qué muestran, cuándo utilizarlos, cuándo evitarlos y cómo crearlos y personalizarlos en Python.
Elena Kosourova's photo

Elena Kosourova

21 min

tutorial

Guía paso a paso para hacer mapas en Python usando la librería Plotly

Haz que tus datos destaquen con impresionantes mapas creados con Plotly en Python
Moez Ali's photo

Moez Ali

7 min

See MoreSee More