matplotlib pyplot uitleg voorbeeld 13

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

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.

Met vertrouwen Python inzetten voor data analyses? Schrijf je in voor een van onze trainingen.



import pandas as pd
df = pd.read_csv('data/knmi/df_knmi.csv')
print(df.shape)
df.head(3)
(804091, 11)
stationdatumtemperatuurneerslagtemperatuur_fjaarmaandstation_naamdecenniaPlaatsProvincie
02092001-01-30NaNNaNNaN20011IJMOND200IJMONDNoord-Holland
12092001-01-31NaNNaNNaN20011IJMOND200IJMONDNoord-Holland
22092001-02-01NaNNaNNaN20012IJMOND200IJMONDNoord-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())
maandstationtemperatuurneerslagtemperatuur_fjaardecennia
01297.1127072.8171162.18530736.0708091986.602639198.670761
12297.0999582.9899111.84321236.3818401986.599845198.671172
23297.0911005.5178781.72422340.9321811986.606188198.671769
34297.1124488.6847971.40255046.6326341986.613707198.672569
45297.13144612.6454491.80177653.7618081986.604768198.671356
56297.13022915.3305232.10795658.5949421986.601582198.670789
67297.16203117.3414292.46221862.2145721986.617706198.672176
78297.15510617.1807402.56392961.9253321986.611085198.671181
89297.11247214.5058772.39824057.1105781986.592290198.669388
910297.14300310.7371532.34312650.3268761986.583398198.668820
1011297.1640356.5469382.49070842.7844881986.590939198.669608
1112297.1763593.8144052.46707637.8659291986.596527198.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]));

matplotlib pyplot uitleg voorbeeld 1

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 vanuit df uit kolom 'maand' op de x-as komen
  • y='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]));

matplotlib pyplot uitleg voorbeeld 2

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]));

matplotlib pyplot uitleg voorbeeld 3

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]));

matplotlib pyplot uitleg voorbeeld 4

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 gemaakt
  • by='maand': de kolom waarop gegroepeerd wordt
df.boxplot(column='temperatuur', by='maand', figsize=[15,5]);

matplotlib pyplot uitleg voorbeeld 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()

matplotlib pyplot uitleg voorbeeld 6

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 toevoegen
    • color='red' kleurt de lijn rood
    • linestyle='dashed' geeft een gestreepte lijn
    • linewidth=2 stelt de lijndikte in
    • marker='.' voegt een marker op elk datapunt toe, in de vorm van een punt
    • markersize=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()

matplotlib pyplot uitleg voorbeeld 7

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()

matplotlib pyplot uitleg voorbeeld 8

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

by: