Een lijngrafiek is een relationele datavisualisatie die laat zien hoe een continue variabele verandert wanneer een andere dat doet. Het is een van de meest gebruikte grafieken in onder andere financiën, sales, marketing, gezondheidszorg en natuurwetenschappen.
In deze tutorial bespreken we hoe je Seaborn, een populaire Python-bibliotheek voor datavisualisatie, gebruikt om lijngrafieken in Python te maken en aan te passen.
De dataset introduceren
Om iets te hebben om seaborn-lijngrafieken op te oefenen, downloaden we eerst een Kaggle-dataset genaamd Daily Exchange Rates per Euro 1999-2024. Vervolgens importeren we alle benodigde packages en lezen en schonen we de dataframe in. Zonder in te gaan op de details van het opschoningsproces, laat de onderstaande code de uit te voeren stappen zien:
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
daily_exchange_rate_df = pd.read_csv('euro-daily-hist_1999_2022.csv')
daily_exchange_rate_df = daily_exchange_rate_df.iloc[:, [0, 1, 4, -2]]
daily_exchange_rate_df.columns = ['Date', 'Australian dollar', 'Canadian dollar', 'US dollar']
daily_exchange_rate_df = pd.melt(daily_exchange_rate_df, id_vars='Date', value_vars=['Australian dollar', 'Canadian dollar', 'US dollar'], value_name='Euro rate', var_name='Currency')
daily_exchange_rate_df['Date'] = pd.to_datetime(daily_exchange_rate_df['Date'])
daily_exchange_rate_df = daily_exchange_rate_df[daily_exchange_rate_df['Date']>='2022-12-01'].reset_index(drop=True)
daily_exchange_rate_df['Euro rate'] = pd.to_numeric(daily_exchange_rate_df['Euro rate'])
print(f'Currencies: {daily_exchange_rate_df.Currency.unique()}\n')
print(df.head())
print(f'\n{daily_exchange_rate_df.Date.dt.date.min()}/{ daily_exchange_rate_df.Date.dt.date.max()}')
Output:
Currencies: ['Australian dollar' 'Canadian dollar' 'US dollar']
Date Currency Euro rate
0 2023-01-27 Australian dollar 1.5289
1 2023-01-26 Australian dollar 1.5308
2 2023-01-25 Australian dollar 1.5360
3 2023-01-24 Australian dollar 1.5470
4 2023-01-23 Australian dollar 1.5529
2022-12-01/2023-01-27
De resulterende dataframe bevat dagelijkse (werkdagen) eurokoersen voor Australische, Canadese en Amerikaanse dollars voor de periode van 01.12.2022 tot en met 27.01.2023.
Nu zijn we klaar om te duiken in het maken en aanpassen van Python-seaborn-lijngrafieken.
Basisprincipes van Seaborn-lijngrafieken
Om een lijngrafiek in Seaborn te maken, kunnen we een van de twee functies gebruiken: lineplot() of relplot(). Over het algemeen hebben ze veel functionaliteit gemeen, met identieke parameternamen. Het belangrijkste verschil is dat relplot() ons in staat stelt lijngrafieken met meerdere lijnen op verschillende facetten te maken. lineplot() daarentegen ondersteunt betrouwbaarheidsintervallen en gegevensaggregatie.
In deze tutorial gebruiken we meestal de functie lineplot().
De cursus Introduction to Data Visualization with Seaborn helpt je de belangrijkste functies en methoden van de seaborn-bibliotheek te leren en oefenen. Je kunt ook onze Seaborn-tutorial voor beginners bekijken om vertrouwder te raken met de populaire Python-bibliotheek.
Eén enkele seaborn-lijngrafiek maken
We kunnen een lijngrafiek maken die de relaties tussen twee continue variabelen laat zien als volgt:
usd = daily_exchange_rate_df[daily_exchange_rate_df['Currency']=='US dollar'].reset_index(drop=True)
sns.lineplot(x='Date', y='Euro rate', data=usd)
Output:

De bovenstaande grafiek toont de EUR-USD-koersdynamiek. We definieerden de variabelen die we op de x- en y-as wilden plotten (de parameters x en y) en de dataframe (data) waaruit deze variabelen worden gehaald.
Ter vergelijking: om dezelfde grafiek met relplot() te maken, zouden we het volgende schrijven:
sns.relplot(x='Date', y='Euro rate', data=usd, kind='line')
Output:

In dit geval gaven we nog een argument door dat specifiek is voor de functie relplot(): kind='line'. Standaard maakt deze functie een scatterplot.
Een enkele seaborn-lijngrafiek aanpassen
We kunnen de bovenstaande grafiek op veel manieren aanpassen om haar leesbaarder en informatiever te maken. Zo kunnen we de figuurafmetingen aanpassen, een titel en aslabels toevoegen, de lettergrootte wijzigen, de lijn aanpassen, markeringen toevoegen en aanpassen, enzovoort. Laten we bekijken hoe we deze verbeteringen in seaborn implementeren.
De figuurafmetingen aanpassen
Omdat Seaborn is gebouwd boven op matplotlib, kunnen we matplotlib.pyplot gebruiken om de figuurafmetingen aan te passen:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=usd)
Output:

Met relplot() kunnen we in plaats daarvan de parameters height en aspect (de breedte-hoogteverhouding) gebruiken voor hetzelfde doel:
sns.relplot(x='Date', y='Euro rate', data=usd, kind='line', height=6, aspect=4)
Output:

Een titel en aslabels toevoegen
Om een grafiektitel en aslabels toe te voegen, kunnen we de functie set() gebruiken op het seaborn-lijngrafiekobject en de argumenten title, xlabel en ylabel meegeven:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=usd).set(title='Euro-USD rate', xlabel='Date', ylabel='Rate')
Output:

De lettergrootte aanpassen
Een handige manier om de lettergrootte aan te passen is de functie set_theme() te gebruiken en te experimenteren met verschillende waarden voor de parameter font_scale:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=usd).set(title='Euro-USD rate', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

Let op dat we ook style='white' hebben toegevoegd om te voorkomen dat de initiële stijl wordt overschreven.
De lijnkleur, -stijl en -dikte wijzigen
Om de lijn in de grafiek aan te passen, kunnen we enkele optionele parameters doorgeven die gemeen zijn met matplotlib.pyplot.plot, zoals color, linestyle of linewidth:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=usd, linestyle='dotted', color='magenta', linewidth=5).set(title='Euro-USD rate', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

Markeringen toevoegen en hun kleur, stijl en grootte aanpassen
Het is mogelijk om markeringen op de lijn toe te voegen en hun uiterlijk aan te passen. Ook in dit geval kunnen we enkele parameters van matplotlib gebruiken, zoals marker, markerfacecolor of markersize:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=usd, marker='*', markerfacecolor='limegreen', markersize=20).set(title='Euro-USD rate', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

De documentatie biedt de ultieme lijst met parameters om de vormgeving van een seaborn-lijngrafiek te verbeteren. We kunnen daar met name alle mogelijke keuzen voor markeringen zien.
In onze Seaborn-cheat sheet vind je andere manieren om een lijngrafiek in Seaborn aan te passen.
Seaborn-lijngrafieken met meerdere lijnen
Vaak willen we onderzoeken hoe meerdere continue variabelen veranderen afhankelijk van een andere continue variabele. Hiervoor kunnen we een seaborn-lijngrafiek met meerdere lijnen bouwen. De functies lineplot() en relplot() zijn ook voor zulke gevallen toepasbaar.
Een seaborn-lijngrafiek met meerdere lijnen maken
Technisch gezien is het mogelijk om een seaborn-lijngrafiek met meerdere lijnen te maken door simpelweg een apart axes-object te bouwen voor elke afhankelijke variabele, dus voor elke lijn:
aud = daily_exchange_rate_df[daily_exchange_rate_df['Currency']=='Australian dollar'].reset_index(drop=True)
cad = daily_exchange_rate_df[daily_exchange_rate_df['Currency']=='Canadian dollar'].reset_index(drop=True)
sns.lineplot(x='Date', y='Euro rate', data=usd)
sns.lineplot(x='Date', y='Euro rate', data=aud)
sns.lineplot(x='Date', y='Euro rate', data=cad)
Output:

Hierboven haalden we nog twee subsets uit onze initiële dataframe daily_exchange_rate_df – voor Australische en Canadese dollars – en plotten we elke eurokoers tegen de tijd. Er zijn echter efficiëntere oplossingen: de parameters hue, style of size gebruiken, die beschikbaar zijn in zowel lineplot() als relplot().
De parameter hue gebruiken
Deze parameter werkt als volgt: we wijzen hem de naam toe van een dataframekolom met categorische waarden, en vervolgens genereert seaborn een lijngrafiek voor elke categorie, met een andere kleur voor elke lijn:
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, hue='Currency')
Output:

Met slechts één simpele regel code maakten we een seaborn-lijngrafiek voor drie categorieën. Let op dat we de initiële dataframe daily_exchange_rate_df doorgaven in plaats van de subsets voor verschillende valuta's.
De parameter style gebruiken
De parameter style werkt op dezelfde manier als hue, alleen onderscheidt hij de categorieën met verschillende lijnstijlen (doorgetrokken, gestreept, gestippeld, enz.), zonder de kleur te beïnvloeden:
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, style='Currency')
Output:

De parameter size gebruiken
Net als hue en style maakt de parameter size een aparte lijn voor elke categorie. Het beïnvloedt niet de kleur en stijl van de lijnen, maar maakt elke lijn een andere dikte:
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, size='Currency')
Output:

Een seaborn-lijngrafiek met meerdere lijnen aanpassen
Laten we nu experimenteren met de vormgeving van onze grafiek. Sommige technieken zijn identiek aan wat we toepasten op een enkele Seaborn-lijngrafiek. Andere zijn specifiek voor lijngrafieken met meerdere lijnen.
Algemene aanpassingen
We kunnen de figuurafmetingen aanpassen, een titel en aslabels toevoegen en de lettergrootte wijzigen op dezelfde manier als bij een enkele lijngrafiek:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, hue='Currency').set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

De kleur, stijl en dikte van elke lijn wijzigen
Eerder zagen we dat wanneer de parameters hue, style of size worden gebruikt, seaborn een standaardset kleuren/stijlen/diktes voor een lijngrafiek met meerdere lijnen levert. Indien nodig kunnen we deze standaardinstellingen overschrijven en zelf kleuren/stijlen/diktes kiezen.
Wanneer we de parameter hue gebruiken, kunnen we ook het argument palette meegeven als een lijst of tuple met matplotlib-kleurnamen. Ik zou onze tutorial, Seaborn Color Palette: Quick Guide to Picking Colors, aanraden om meer te begrijpen over kleurentheorie en om veel goede ideeën op te doen om je visuals er mooi uit te laten zien.
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, hue='Currency', palette=['magenta', 'deepskyblue', 'yellowgreen']).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

Het is ook mogelijk om direct een bestaand matplotlib-palet toe te passen:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, hue='Currency', palette='spring').set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

Tegelijkertijd kunnen we, wanneer we hue gebruiken, nog steeds de lijnstijl en -dikte van alle lijnen aanpassen door de argumenten linestyle en linewidth door te geven:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, hue='Currency', palette=['magenta', 'deepskyblue', 'yellowgreen'], linestyle='dashed', linewidth=5).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

Wanneer we daarentegen een seaborn-lijngrafiek met meerdere lijnen maken met de parameter style, kunnen we een lijst (of tuple) van lijsten (of tuples) toewijzen aan een parameter genaamd dashes:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, style='Currency', dashes=[[4, 4], [6, 1], [3, 9]]).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

In de bovenstaande lijst van lijsten die aan dashes is toegewezen, vertegenwoordigt het eerste item van elke sublijst de lengte van een segment van de corresponderende lijn, terwijl het tweede item – de lengte van een onderbreking.
Opmerking: om een doorgetrokken lijn te representeren, moeten we de lengte van de onderbreking op nul zetten, bijv.: [1, 0].
Om de kleur en dikte van alle lijnen in deze grafiek aan te passen, geven we de argumenten color en linewidth op, net zoals we deden bij het aanpassen van een enkele seaborn-lijngrafiek:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, style='Currency', dashes=[[4, 4], [6, 1], [3, 9]], color='darkviolet', linewidth=4).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

Tot slot, wanneer we de parameter size gebruiken om een seaborn-meerregelige lijngrafiek te maken, kunnen we de dikte van elke lijn regelen via de parameter sizes. Die neemt een lijst (of tuple) met gehele getallen aan:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, size='Currency', sizes=[2, 10, 5]).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

Om de kleur en stijl van alle lijnen in deze grafiek aan te passen, moeten we de argumenten linestyle en color opgeven:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, size='Currency', sizes=[2, 10, 5], linestyle='dotted', color='teal').set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

Markeringen toevoegen en hun kleur, stijl en grootte aanpassen
We willen mogelijk markeringen toevoegen aan onze seaborn-meerregelige lijngrafiek.
Om markeringen van dezelfde kleur, stijl en grootte aan alle lijnen toe te voegen, gebruiken we parameters uit matplotlib, zoals marker, markerfacecolor, markersize, enz., net zoals we deden voor een enkele lijngrafiek:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, hue='Currency', marker='o', markerfacecolor='orangered', markersize=10).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

Het is echter anders wanneer we verschillende markeringen voor elke lijn willen. In dat geval moeten we de parameter markers gebruiken, die volgens de functionaliteiten van seaborn echter alleen werkt wanneer de parameter style is opgegeven:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, style='Currency', markers=['o', 'X', '*'], markerfacecolor='brown', markersize=10).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

Op de bovenstaande grafiek kunnen we alle lijnen doorgetrokken maken door het argument dashes op te geven en het patroon [1, 0] voor elke lijn in te stellen:
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Date', y='Euro rate', data=daily_exchange_rate_df, style='Currency', markers=['o', 'X', '*'], dashes=[[1, 0], [1, 0], [1, 0]], markerfacecolor='brown', markersize=10).set(title='Euro rates for different currencies', xlabel='Date', ylabel='Rate')
sns.set_theme(style='white', font_scale=3)
Output:

Conclusie
Samenvattend hebben we in deze tutorial verschillende manieren geleerd om een Seaborn-lijngrafiek te maken en aan te passen, met één of meerdere lijnen.
Als volgende stap kun je met seaborn nog veel meer doen om een lijngrafiek verder te verfijnen. Zo kun je:
- Lijnen groeperen op meer dan één categorische variabele
- De legenda aanpassen
- Lijngrafieken met meerdere lijnen op verschillende facetten maken
- Het betrouwbaarheidsinterval weergeven en aanpassen
- Tijd-as-ticks en hun labels aanpassen voor een tijdreeks-lijngrafiek
Wil je dieper ingaan op wat en hoe je met seaborn kunt doen, overweeg dan onze cursus Intermediate Data Visualization with Seaborn.
Veelgestelde vragen over Seaborn-lijngrafieken
Wat is een lijngrafiek in Seaborn?
Een lijngrafiek is een type grafiek in Seaborn dat de relatie tussen twee variabelen laat zien door de datapunten met een rechte lijn te verbinden.
Voor welk soort data is een lijngrafiek in Seaborn het meest geschikt?
Lijngrafieken zijn het meest geschikt voor data waarbij er een duidelijke relatie is tussen twee variabelen, en waarbij de variabelen continu of ordinaal zijn.
Kan ik meerdere lijnen op dezelfde grafiek plotten in Seaborn?
Ja, je kunt meerdere lijnen op dezelfde grafiek plotten in Seaborn door de parameter hue te gebruiken om een categorische variabele op te geven waarop je de data groepeert.
Wat is het verschil tussen een lijngrafiek en een scatterplot in Seaborn?
Een lijngrafiek in Seaborn laat de relatie tussen twee variabelen zien met een rechte lijn, terwijl een scatterplot de relatie toont met individuele datapunten.
Kan ik een regressielijn toevoegen aan mijn lijngrafiek in Seaborn?
Ja, je kunt een regressielijn aan je lijngrafiek toevoegen in Seaborn met de functie regplot(), die een lineair regressiemodel tussen twee variabelen fit en plot.
Hoe sla ik mijn Seaborn-lijngrafiek op naar een bestand?
Je kunt je Seaborn-lijngrafiek opslaan naar een bestand met de functie savefig() uit de bibliotheek matplotlib, die de huidige figuur opslaat naar een opgegeven bestandspad en -formaat.
