Cursus
Een tijdreeks is een verzameling waarnemingen die chronologisch op tijd zijn geordend. Deze waarnemingen worden vaak (maar niet per se) op regelmatige tijdsintervallen vastgelegd. Tijdreeksen worden veel gebruikt in bankwezen, trading, marketing, wetenschap en andere sectoren. De meest gebruikelijke visuele weergave van tijdreeksgegevens is een lijndiagram, waarbij de tijd op de x-as staat en de gemeten waarde op de y-as.
In deze tutorial verkennen we hoe je lijndiagrammen van tijdreeksen maakt en aanpast in matplotlib, een primaire Python-plotbibliotheek.
Aan de slag met tijdreeksplotten in matplotlib
Bibliotheken importeren en de data laden
We importeren eerst de benodigde Python-bibliotheken en laden de data – een Kaggle-dataset Daily Exchange Rates per Euro 1999-2023. We voeren ook wat basisopschoning van de data uit:
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()}')
Output:
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
Datum/tijd-strings converteren naar datetime-objecten
Om efficiënt met tijdreeksen te werken, moeten we datum- of tijdstrings omzetten naar datetime-objecten met de functie pandas.to_datetime:
df['Date'] = pd.to_datetime(df['Date'])
print(df['Date'].dtypes)
Output:
datetime64[ns]
Als je een opfrisser nodig hebt over werken met tijdreeksen in Python, dan is de cursus Manipulating Time Series Data in Python mogelijk nuttig.
Een datetime-kolom instellen als dataframe-index
Laten we nu de kolom Date als dataframe-index instellen met de methode set_index:
df = df.set_index('Date')
print(df.head(3))
Output:
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
Een basislijndiagram van tijdreeksen maken in matplotlib
Om een eenvoudig lijndiagram van een tijdreeks te maken, gebruiken we de standaardmethode matplotlib.pyplot.plot(x, y):
plt.plot(df.index, df['CAD'])
Output:

Een lijndiagram met meerdere reeksen maken in matplotlib
Om een lijndiagram met meerdere tijdreeksen te maken, voeren we de matplotlib.pyplot.plot(x, y)-methode simpelweg het benodigde aantal keren uit:
plt.plot(df.index, df['CAD'])
plt.plot(df.index, df['NZD'])
plt.plot(df.index, df['USD'])

Met een for-lus maak je de bovenstaande code efficiënter:
for col in ['CAD', 'NZD', 'USD']:
plt.plot(df.index, df[col])
Output:

Tijdreeksplots in matplotlib aanpassen
Om ons lijndiagram van tijdreeksen leesbaarder en aansprekender te maken, moeten we het aanpassen. We kunnen veelgebruikte matplotlib-instellingen toepassen, zoals het aanpassen van de afbeeldingsgrootte, het toevoegen en stylen van een titel en aslabels, het wijzigen van lijneigenschappen, het toevoegen en aanpassen van markers, enzovoort. Andere aanpassingen zijn specifiek voor lijndiagrammen van tijdreeksen, zoals het instellen van ticks en hun labels op de tijdas of het markeren van bepaalde perioden.
De figuur en assen aanpassen
Met standaardmethodes in matplotlib kunnen we de figuur en assen van een lijndiagram van tijdreeksen op allerlei manieren aanpassen, zoals beschreven in de commentaarregels in de code hieronder:
# 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'))
Output:

Lijneigenschappen aanpassen
Net als bij gewone lijndiagrammen kun je de lijneigenschappen van een tijdreeksplot wijzigen, zoals lijnkleur, -stijl of -dikte:
plt.plot(df.index, df['CAD'], color='green', linestyle='dashed', linewidth=3)
Output:

Markers toevoegen en aanpassen
Zoals bij elk lijndiagram kunnen we markers op een tijdreeksplot plaatsen en hun symbool, kleur, randkleur en grootte aanpassen:
plt.plot(df.index, df['CAD'], marker='o', markerfacecolor='yellow', markeredgecolor='red', markersize=8)

Ticks op de tijdas instellen
Laten we eerst een basisplot van een tijdreeks in matplotlib maken met enkele essentiële aanpassingen:
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())
Output:

We zien dat matplotlib standaard willekeurige ticks en bijbehorende labels toont. Soms wil je echter zelf bepalen welke ticks op de tijdas verschijnen. In dat geval geef je een lijst met de gewenste datums (of tijden) als strings of pandas-timestamps door aan de methode 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)
Output:

Hierboven toonde matplotlib de geselecteerde ticks en labelde ze automatisch.
Als we alle ticks willen tonen, moeten we een lijst met de indices van de tijdreeks doorgeven aan de methode 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 all time axis ticks
ticks = list(df.index)
plt.xticks(ticks, rotation=45)
Output:

Ticklabels op de tijdas aanpassen
De ticklabels op de tijdas in de bovenstaande plot kunnen overweldigend ogen. We kunnen ze formatteren om ze leesbaarder te maken. Hiervoor gebruiken we de klasse matplotlib.dates.DateFormatter en geven we een strftime-opmaakstring mee die aangeeft hoe we de datums/tijden willen weergeven. Vervolgens geven we deze formatter door aan de methode 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'))
Output:

Deze documentatiepagina biedt een volledige lijst met alle mogelijke strftime-opmaakcodes.
Bepaalde perioden markeren
Soms willen we bepaalde perioden arceren in een lijndiagram van tijdreeksen. Daarvoor kunnen we de methode matplotlib.pyplot.axvspan gebruiken. Deze neemt twee vereiste argumenten: de begin- en eindtijdpunten van de periode van interesse in een datetime-formaat. De methode accepteert ook optionele parameters om het uiterlijk van het gemarkeerde gebied aan te passen, zoals de kleur, randkleur, transparantie, lijndikte of arceerpatroon.
Laten we deze techniek toepassen op de plot uit de vorige sectie:
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)
Output:

Een matplotlib-lijndiagram van tijdreeksen opslaan naar een bestand
In plaats van een plot alleen weer te geven, kunnen we ervoor kiezen om een lijndiagram van een tijdreeks op te slaan als afbeeldingsbestand. Dat doen we met de methode matplotlib.pyplot.savefig en geven we de bestandsnaam mee. Laten we bijvoorbeeld teruggaan naar onze eerste basisplot:
plt.plot(df.index, df['CAD'])
# Saving the resulting plot to a file
plt.savefig('time series line plot.png')

Hierboven hebben we de plot opgeslagen in een bestand met de naam time series line plot.png, dat zich op dezelfde locatie bevindt als ons huidige programma.
Conclusie
Samengevat hebben we in deze tutorial besproken hoe je lijndiagrammen van tijdreeksen maakt en aanpast in matplotlib, met zowel algemene matplotlib-methodes als meer geavanceerde technieken die specifiek zijn voor visualisaties van tijdreeksen.
Na het leren van deze basisvaardigheden wil je misschien dieper duiken in het werken met tijdreeksdata en de visualisatie ervan in Python. Overweeg in dat geval de volgende uitgebreide, beginnersvriendelijke en end-to-end bronnen:
