Met het Python package Matplotlib kun je als data scientist mooie visualisaties maken van je datasets. Het geeft een uitgebreide library met verschillende grafieken die je naar je wensen kunt aanpassen.
Er kunnen diverse soorten grafieken mee gemaakt worden, variërend van histogrammen en scatterplots tot niet-cartesische coördinaten grafieken.
Een veelgebruikte module uit matplotlib is Pyplot. In dit blog zullen we stap voor stap laten zien hoe je een grafiek maakt in matplotlib.
De Pyplot module wordt doorgaans op onderstaande wijze geïmporteerd.
import matplotlib.pyplot as plt
Vanuit Pandas, een Python package wat hulpmiddelen biedt voor de omgang met datasets, kun je direct gebruik maken van de plot mogelijkheden van Matplotlib.
Je zult in dit blog leren
- Hoe plot je matplotlib grafieken van een Pandas DataFrame?
- Hoe bouw ik stap voor stap een matplotlib grafiek op?
Plot matplotlib grafieken met Pandas DataFrames
In deze tutorial werken we met datasets met KNMI metingen. Je kunt de dataset hier downloaden zodat je mee kunt doen met deze tutorial.
In het volgende voorbeeld openen we de KNMI dataset, df_knmi.csv
. Hierin staan temperatuur- en neerslagmetingen van alle KNMI stations in Nederland van meer dan 100 jaar. Het is een groot bestand (>50MB), dus downloaden en openen kan even duren.
import pandas as pd
df = pd.read_csv('data/knmi/df_knmi.csv')
print(df.shape)
df.head(3)
(804091, 11)
station | datum | temperatuur | neerslag | temperatuur_f | jaar | maand | station_naam | decennia | Plaats | Provincie | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 209 | 2001-01-30 | NaN | NaN | NaN | 2001 | 1 | IJMOND | 200 | IJMOND | Noord-Holland |
1 | 209 | 2001-01-31 | NaN | NaN | NaN | 2001 | 1 | IJMOND | 200 | IJMOND | Noord-Holland |
2 | 209 | 2001-02-01 | NaN | NaN | NaN | 2001 | 2 | IJMOND | 200 | IJMOND | Noord-Holland |
De dataset bevat veel data. Om makkelijk een visualisatie te kunnen maken groeperen we op maand. Dit om zo bijvoorbeeld de gemiddelde temperatuur te bepalen over alle weerstations en alle jaren aan metingen.
(df.groupby('maand')
.mean()
.reset_index())
maand | station | temperatuur | neerslag | temperatuur_f | jaar | decennia | |
---|---|---|---|---|---|---|---|
0 | 1 | 297.112707 | 2.817116 | 2.185307 | 36.070809 | 1986.602639 | 198.670761 |
1 | 2 | 297.099958 | 2.989911 | 1.843212 | 36.381840 | 1986.599845 | 198.671172 |
2 | 3 | 297.091100 | 5.517878 | 1.724223 | 40.932181 | 1986.606188 | 198.671769 |
3 | 4 | 297.112448 | 8.684797 | 1.402550 | 46.632634 | 1986.613707 | 198.672569 |
4 | 5 | 297.131446 | 12.645449 | 1.801776 | 53.761808 | 1986.604768 | 198.671356 |
5 | 6 | 297.130229 | 15.330523 | 2.107956 | 58.594942 | 1986.601582 | 198.670789 |
6 | 7 | 297.162031 | 17.341429 | 2.462218 | 62.214572 | 1986.617706 | 198.672176 |
7 | 8 | 297.155106 | 17.180740 | 2.563929 | 61.925332 | 1986.611085 | 198.671181 |
8 | 9 | 297.112472 | 14.505877 | 2.398240 | 57.110578 | 1986.592290 | 198.669388 |
9 | 10 | 297.143003 | 10.737153 | 2.343126 | 50.326876 | 1986.583398 | 198.668820 |
10 | 11 | 297.164035 | 6.546938 | 2.490708 | 42.784488 | 1986.590939 | 198.669608 |
11 | 12 | 297.176359 | 3.814405 | 2.467076 | 37.865929 | 1986.596527 | 198.670237 |
Hier kunnen we op voortbouwen, door gebruik te maken van de plot
methode vanuit Matplotlib die in Pandas is geïntegreerd. Binnen plot
bestaat een diversiteit aan mogelijkheden. Zo is met line()
een lijngrafiek te maken.
(df.groupby('maand')
.mean()
.reset_index()
.plot
.line(x='maand', y='temperatuur', figsize=[15,4]));
Binnen plot.line()
kunnen diverse argumenten en parameters toegevoegd worden. Hier is gebruik gemaakt van de volgende onderdelen:
x='maand
: Hiermee wordt aangeven dat waarden vanuitdf
uit kolom'maand'
op de x-as komeny='temperatuur
: De y-as toont waarden uit kolom'temperatuur'
figsize=[15,2]
: De grafiek die we plotten heeft een verhouding van 15 breed en 2 hoog
Door line()
aan te passen kunnen eenvoudig andere grafieksoorten gekozen worden, zoals bijvoorbeeld bar()
voor een vertikale staafgrafiek.
(df.groupby('maand')
.mean()
.reset_index()
.plot
.bar(x='maand', y='temperatuur', figsize=[15,4]));
Om een tweede serie aan de grafiek toe te voegen kun je eenvoudig de betreffende kolomnaam toevoegen aan y
. In dit geval voegen we de gemiddelde neerslag toe. Dit door y='temperatuur'
te veranderen in y=['temperatuur', 'neerslag']
.
(df.groupby('maand')
.mean()
.reset_index()
.plot
.bar(x='maand', y=['temperatuur', 'neerslag'], figsize=[15,4]));
Om afzonderlijke focus aan dataseries te geven kun je subplots toevoegen. Dit kan door het argument subplots=True
toe te voegen.
(df.groupby('maand')
.mean()
.reset_index()
.plot
.bar(x='maand', y=['temperatuur', 'neerslag'], subplots=True, figsize=[15,6]));
Een ander voorbeeld van een datavisualisatie is een boxplot. Dit kan gemaakt worden door plot
te vervangen door boxplot()
. Hierbij passen we de volgende nieuwe argumenten toe:
column='temperatuur'
: de kolom waarvoor de boxplot wordt gemaaktby='maand'
: de kolom waarop gegroepeerd wordt
df.boxplot(column='temperatuur', by='maand', figsize=[15,5]);
Hoe bouw ik stap voor stap een Matplotlib grafiek op?
We hebben gezien dat we direct vanuit Pandas DataFrames Matplotlib grafieken kunnen maken. Nu werken we niet altijd met Pandas, of kan het zijn dat je specifieke aanpassingen wil doen aan een grafiek.
In deze gevallen kun je beter stap voor stap een grafiek opbouwen. Dit werkt als volgt. Om met Matplotlib te werken moet je het eerst importeren.
import matplotlib.pyplot as plt
Je maakt nu eerst een figuur aan om op te kunnen plotten. Dit doe je bijvoorbeeld als volgt.
fig = plt.figure()
Aan plt.figure()
kun je argumenten meegeven, bijvoorbeeld figsize=(15, 5)
wat de breedte en hoogte van de figuur aanduidt.
Binnen een figuur maak je een of meerdere subplots aan. Dit doe je bijvoorbeeld als volgt.
ax = fig.add_subplot(1,1,1)
Hierin is 1,1,1
een representatie van het raster waarin je meerdere subplots kunt plotten: a,b,c
: a: aantal rijen
, b: aantal kolommen
, c: positie
. In dit geval betekent 1,1,1
dus 1 rij, 1 kolom, de eerste positie.
Om een plot te laten zien gebruik je het volgende commando.
plt.show()
Aan de slag!
Je hebt nu gezien dat je met onderstaande code Matplotlib importeert, ervoor zorgt dat je in Jupyter Notebook kan plotten, je hebt een figuur aangemaakt, hierbinnen een subplot, en het resultaat hiervan toon je.
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
plt.show()
Om een grafiek te plotten heb je data nodig. Van elk punt heb je zowel een x-coördinaat als y-coördinaat nodig. Dit zijn je x en y waarden.
Als voorbeeld kunnen we Numpy arrays gebruiken.
import numpy as np
x = np.array([0, 1, 2, 3, 4, 5])
y = np.array([1., 0.368, 0.135, 0.050, 0.018, 0.007])
Nu kunnen we ax.plot(x, y)
toevoegen om dit als een lijn te plotten.
import matplotlib.pyplot as plt
import numpy as np
x = np.array([0, 1, 2, 3, 4, 5])
y = np.array([1., 0.368, 0.135, 0.050, 0.018, 0.007])
fig = plt.figure(figsize=(15, 4))
ax = fig.add_subplot(1,1,1)
ax.plot(x, y)
plt.show()
Customizen van de grafiek
De grafiek oogt nu nog erg basic. Matplotlib biedt echter erg veel mogelijkheden tot het doen van persoonlijke aanpassingen.
We laten enkele aanpassingen zien:
- In
ax.plot(x, y)
kun je argumenten toevoegencolor='red'
kleurt de lijn roodlinestyle='dashed'
geeft een gestreepte lijnlinewidth=2
stelt de lijndikte inmarker='.'
voegt een marker op elk datapunt toe, in de vorm van een puntmarkersize=10
stelt de grootte van de marker in
- Met
ax.axhline(.8, color='lightgrey')
kun je voor een bepaalde y-waarde een horizontale lijn toevoegen - As-labels en een titel zijn toe te voegen met:
ax.set_xlabel('x-label')
ax.set_ylabel('y-label')
ax.set_title('Grafiektitel')
Veel eigenschappen die je aan kunt passen zijn hier te vinden.
import matplotlib.pyplot as plt
import numpy as np
x = np.array([0, 1, 2, 3, 4, 5])
y = np.array([1., 0.368, 0.135, 0.050, 0.018, 0.007])
fig = plt.figure(figsize=(15, 4))
ax = fig.add_subplot(1,1,1)
ax.plot(x, y, color='red', linestyle='dashed', linewidth=2, marker='.', markersize=10)
ax.axhline(.8, color='lightgrey')
ax.axhline(.2, color='lightgrey')
ax.set_xlabel('x-label')
ax.set_ylabel('y-label')
ax.set_title('Grafiektitel')
plt.show()
Nu gaan we het matplotlib grafiektype aanpassen
Standaard plot je met plot()
een lijngrafiek.
Dit kun je eenvoudig veranderen in een ander type door bijvoorbeeld plot()
te veranderen door bar()
Hou er rekening mee dat andere grafiektypes met andere argumenten kunnen werken.
import matplotlib.pyplot as plt
import numpy as np
x = np.array([0, 1, 2, 3, 4, 5])
y = np.array([1., 0.368, 0.135, 0.050, 0.018, 0.007])
fig = plt.figure(figsize=(15, 4))
ax = fig.add_subplot(1,1,1)
ax.bar(x, y)
ax.axhline(.8, color='lightgrey')
ax.axhline(.2, color='lightgrey')
ax.set_xlabel('x-label')
ax.set_ylabel('y-label')
ax.set_title('Grafiektitel')
plt.show()
Wil je nog veel meer leren over met mogelijkheden met Python voor Data Science? Schrijf je dan in voor onze Python cursus voor data science, onze machine learning training, onze data science opleiding of onze data science bootcamp en leer met vertrouwen te programmeren en analyseren in Python. Nadat je een van onze trainingen hebt gevolgd kun je zelfstandig verder aan de slag. Je kunt ook altijd even contact opnemen als je een vraag hebt.
Download één van onze opleidingsbrochures voor meer informatie
Peter is een ervaren data scientist en python trainer. Na zijn studie aan de Technische Universiteit Delft heeft hij zich altijd bezig gehouden met data en diverse programmeertalen. Peter heeft veel data analyses uitgevoerd en processen geautomatiseerd met Python in productieomgevingen.