Python voor Data Analytics: Matplotlib, Seaborn en visualisatie voor sollicitatiegesprekken

Python-datavisualisatie onder de knie krijgen met Matplotlib en Seaborn. Praktische tutorial met grafieken, styling, subplots en veelgestelde interviewvragen voor data analytics-functies in 2026.

Python-datavisualisatie met Matplotlib en Seaborn voor data analytics-interviews

Datavisualisatie met Python behoort tot de meest geteste vaardigheden in sollicitatiegesprekken voor data analytics-functies. Hiring managers verwachten dat kandidaten overzichtelijke en leesbare grafieken uit ruwe data produceren — en hun ontwerpkeuzes onder tijdsdruk kunnen toelichten.

Deze tutorial behandelt Matplotlib 3.10 en Seaborn 0.13, de twee bibliotheken die technische interviews voor analist- en data science-posities domineren. Alle codevoorbeelden draaien direct met Python 3.12+.

Interview-tip

De meeste data analytics-interviews bevatten een live coding-ronde waarin kandidaten binnen 15 minuten een visualisatie uit een dataset moeten genereren. De onderstaande patronen sluiten direct aan op deze oefeningen.

Een Python-omgeving voor datavisualisatie opzetten

Voordat er grafiekcode geschreven wordt, heeft de omgeving de juiste dependencies nodig. Een schone virtuele omgeving voorkomt versieconflicten tussen Matplotlib, Seaborn en hun gedeelde NumPy/Pandas-basis.

bash
# setup.sh
python -m venv venv
source venv/bin/activate
pip install matplotlib==3.10.8 seaborn==0.13.2 pandas numpy

Een snelle controle bevestigt dat alles werkt:

python
# verify_install.py
import matplotlib
import seaborn as sns
import pandas as pd

print(f"Matplotlib: {matplotlib.__version__}")
print(f"Seaborn: {sns.__version__}")
print(f"Pandas: {pd.__version__}")

Met de dependencies vastgelegd, richt de volgende stap zich op de Matplotlib-basis — het fundament voor elke Seaborn-grafiek.

Matplotlib-basis: Figure, Axes en de objectgeoriënteerde API

Matplotlib biedt twee API's: de pyplot state machine en de objectgeoriënteerde (OO) interface. De OO-API biedt expliciete controle over elk element en is de standaard die verwacht wordt in professionele codebases en interviews.

python
# bar_chart_oo.py
import matplotlib.pyplot as plt
import numpy as np

# Voorbeeld: kwartaalomzet
quarters = ["Q1", "Q2", "Q3", "Q4"]
revenue = [42_000, 58_000, 51_000, 67_000]

# Figure en axes expliciet aanmaken
fig, ax = plt.subplots(figsize=(8, 5))

# Balken tekenen met een specifieke kleur
ax.bar(quarters, revenue, color="#2563eb", width=0.5)

# Assen duidelijk labelen — interviewers controleren dit
ax.set_xlabel("Quarter")
ax.set_ylabel("Revenue (USD)")
ax.set_title("Quarterly Revenue — 2025")

# Y-as formatteren met dollarbedragen
ax.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f"${x:,.0f}"))

# Bovenste en rechter randen verwijderen voor een strakker uiterlijk
ax.spines[["top", "right"]].set_visible(False)

plt.tight_layout()
plt.savefig("quarterly_revenue.png", dpi=150)
plt.show()

Belangrijke details waar interviewers op letten: expliciete fig, ax-creatie in plaats van plt.plot(), leesbare aslabels, geformatteerde tick-waarden en verwijderde overbodige randelementen (onnodige spines). Deze kleine keuzes signaleren productieklaar denken.

Subplots bouwen voor vergelijkende analyse

In interviews wordt regelmatig gevraagd om meerdere metrics naast elkaar te vergelijken. De functie subplots() handelt dit af met een rasterindeling.

python
# subplots_comparison.py
import matplotlib.pyplot as plt
import numpy as np

months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]
users = [1200, 1350, 1500, 1420, 1680, 1820]
revenue = [24_000, 27_000, 30_000, 28_400, 33_600, 36_400]

# Twee naast elkaar geplaatste grafieken met onafhankelijke y-assen
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5), sharey=False)

# Linker paneel: gebruikersgroei als lijngrafiek
ax1.plot(months, users, marker="o", color="#2563eb", linewidth=2)
ax1.set_title("Monthly Active Users")
ax1.set_ylabel("Users")
ax1.spines[["top", "right"]].set_visible(False)

# Rechter paneel: omzet als staafgrafiek
ax2.bar(months, revenue, color="#16a34a", width=0.5)
ax2.set_title("Monthly Revenue")
ax2.set_ylabel("Revenue (USD)")
ax2.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f"${x:,.0f}"))
ax2.spines[["top", "right"]].set_visible(False)

fig.suptitle("Product Metrics — H1 2025", fontsize=14, fontweight="bold")
plt.tight_layout()
plt.savefig("product_metrics.png", dpi=150)
plt.show()

Het gebruik van sharey=False laat elk paneel onafhankelijk schalen — omzet in dollars en gebruikersaantallen hebben verschillende ordes van grootte. De suptitle voegt een overkoepelende titel boven beide subplots toe.

Veelgemaakte interviewfout

Kandidaten gebruiken vaak plt.plot() voor alles in plaats van de objectgeoriënteerde API. Wanneer een interviewer vraagt om een tweede y-as toe te voegen of een enkel subplot aan te passen, schiet de pyplot-aanpak tekort. De OO-API met fig, ax = plt.subplots() moet altijd de standaardkeuze zijn.

Statistische Seaborn-grafieken: van distributie tot correlatie

Seaborn bouwt voort op Matplotlib en is gespecialiseerd in statistische visualisatie. Waar Matplotlib handmatige configuratie vereist, leidt Seaborn redelijke standaardinstellingen af uit de datastructuur.

Een distributieanalyse — een van de meest voorkomende interviewopdrachten — vereist slechts één functieaanroep:

python
# distribution_analysis.py
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# Salarisgegevens simuleren voor twee afdelingen
np.random.seed(42)
data = pd.DataFrame({
    "salary": np.concatenate([
        np.random.normal(75_000, 12_000, 200),  # Engineering
        np.random.normal(65_000, 10_000, 150),  # Marketing
    ]),
    "department": ["Engineering"] * 200 + ["Marketing"] * 150
})

# KDE-plot om salarisverdeelingen te vergelijken
fig, ax = plt.subplots(figsize=(10, 5))
sns.kdeplot(
    data=data,
    x="salary",
    hue="department",        # Automatische splitsing per categorie
    fill=True,               # Gearceerd gebied onder de curve
    alpha=0.4,
    palette=["#2563eb", "#dc2626"],
    ax=ax                    # Koppelen aan onze expliciete axes
)

ax.set_title("Salary Distribution by Department")
ax.set_xlabel("Annual Salary (USD)")
ax.xaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f"${x:,.0f}"))
ax.spines[["top", "right"]].set_visible(False)

plt.tight_layout()
plt.savefig("salary_distribution.png", dpi=150)
plt.show()

De hue-parameter splitst de data automatisch, en fill=True maakt overlappende gebieden zichtbaar. Dit patroon — distributies groeperen per categorie — komt in vrijwel elk analytics-interview voor.

Klaar om je Data Analytics gesprekken te halen?

Oefen met onze interactieve simulatoren, flashcards en technische tests.

Seaborn-heatmaps voor correlatiematrices

Correlatie-heatmaps onthullen relaties tussen numerieke variabelen in één oogopslag. Interviewers gebruiken ze om te testen of kandidaten multicollineariteit kunnen herkennen of sterke feature-relaties kunnen identificeren.

python
# correlation_heatmap.py
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# E-commerce metrics simuleren
np.random.seed(42)
n = 500
page_views = np.random.poisson(15, n)
time_on_site = page_views * 2.5 + np.random.normal(0, 5, n)
cart_adds = np.random.binomial(page_views, 0.3)
purchases = np.random.binomial(cart_adds, 0.4)

df = pd.DataFrame({
    "page_views": page_views,
    "time_on_site": time_on_site,
    "cart_adds": cart_adds,
    "purchases": purchases
})

# Pearson-correlatie berekenen
corr_matrix = df.corr()

fig, ax = plt.subplots(figsize=(8, 6))
sns.heatmap(
    corr_matrix,
    annot=True,              # Correlatiewaarden in cellen tonen
    fmt=".2f",               # Twee decimalen
    cmap="RdBu_r",           # Divergerend kleurenpalet gecentreerd op 0
    vmin=-1, vmax=1,         # Vaste schaal voor consistentie
    square=True,             # Vierkante cellen
    linewidths=0.5,
    ax=ax
)

ax.set_title("E-commerce Metrics Correlation")
plt.tight_layout()
plt.savefig("correlation_heatmap.png", dpi=150)
plt.show()

Het divergerende RdBu_r-kleurenpalet maakt positieve correlaties blauw en negatieve rood — een conventie die interviewers verwachten. De instelling vmin=-1 en vmax=1 zorgt ervoor dat de kleurschaal interpreteerbaar blijft ongeacht het werkelijke databereik.

Grafieken stijlen voor professionele presentaties

De standaarduitvoer van Matplotlib ziet er gedateerd uit. Een paar configuratieregels transformeren grafieken in presentatiewaardige visualisaties die tijdens interviews oog voor detail aantonen.

python
# professional_styling.py
import matplotlib.pyplot as plt
import seaborn as sns

# Seaborns ingebouwde thema toepassen
sns.set_theme(
    style="whitegrid",       # Schone achtergrond met rasterlijnen
    palette="muted",         # Professioneel kleurenpalet
    font_scale=1.1           # Iets grotere tekst
)

# Globale Matplotlib-overrides
plt.rcParams.update({
    "figure.facecolor": "white",
    "axes.facecolor": "white",
    "font.family": "sans-serif",
    "axes.titlesize": 14,
    "axes.labelsize": 12,
})

Het toepassen van sns.set_theme() aan het begin van een script zorgt voor consistente styling in alle daaropvolgende grafieken. Tijdens interviews bespaart dit kostbare tijd die anders aan per-grafiek formatting besteed zou worden.

Versie-opmerking

Seaborn 0.13 heeft set_style() en set_palette() als aparte aanroepen gedeprecieerd. De uniforme functie set_theme() vervangt beide. Oudere Stack Overflow-antwoorden verwijzen nog naar de gedeprecieerde API — vermijd het gebruik hiervan in interviews in 2026.

Veelgestelde interviewvragen over datavisualisatie

Naast het programmeren toetsen interviewers ook het conceptuele begrip van best practices in visualisatie. De onderstaande vragen komen consistent terug in interviews voor data analytics en data science.

Wanneer moet een staafgrafiek worden gebruikt in plaats van een lijngrafiek? Staafgrafieken tonen vergelijkingen tussen discrete categorieën (afdelingen, producttypen, regio's). Lijngrafieken tonen trends over continue of geordende intervallen (tijdreeksen, sequentiële metingen). Het gebruik van een lijngrafiek voor ongeordende categorieën suggereert een valse relatie tussen aangrenzende datapunten.

Wat maakt een grafiek misleidend? Afgekapte y-assen, dubbele y-assen met verschillende schalen, 3D-effecten op 2D-data en selectief gekozen tijdsperioden vervormen de perceptie. De oplossing: begin de y-as bij nul voor staafgrafieken, label assen expliciet en vermijd decoratieve elementen die de data verhullen.

Hoe beïnvloedt de keuze van kleurenpalet de data-interpretatie? Sequentiële paletten (licht-naar-donker) zijn geschikt voor geordende data zoals temperatuur of omzet. Divergerende paletten (twee tinten die samenkomen in een neutraal centrum) benadrukken afwijkingen van een middenpunt, zoals winst/verlies of correlatiecoëfficiënten. Categorische paletten gebruiken onderscheidende tinten voor ongerelateerde groepen. Kleurenblindvriendelijke paletten (zoals Seaborns colorblind of muted) waarborgen toegankelijkheid — een detail dat senior kandidaten onderscheidt.

Wat is het verschil tussen plt.show() en plt.savefig()? plt.show() rendert de figuur naar een interactief venster en wist daarna de figuurstatus. plt.savefig() schrijft de figuur naar een bestand zonder deze te wissen. Het aanroepen van savefig() na show() produceert een leeg bestand — een veelvoorkomende bug. De juiste volgorde: eerst savefig(), dan show().

Alles samenbrengen: end-to-end interview-oefening

Een typische thuisopdracht of live coding-oefening combineert het laden van data, opschoning en meerdere grafiektypen. Het volgende voorbeeld weerspiegelt echte interviewopdrachten van analytics-teams.

python
# interview_exercise.py
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

sns.set_theme(style="whitegrid", palette="muted", font_scale=1.05)

# 12 maanden productdata simuleren
np.random.seed(42)
months = pd.date_range("2025-01", periods=12, freq="MS")
df = pd.DataFrame({
    "month": months,
    "revenue": np.cumsum(np.random.normal(5000, 2000, 12)) + 50_000,
    "customers": np.cumsum(np.random.poisson(50, 12)) + 500,
    "churn_rate": np.clip(np.random.normal(0.05, 0.015, 12), 0.01, 0.12)
})

fig, axes = plt.subplots(1, 3, figsize=(18, 5))

# Paneel 1: Omzettrend
axes[0].plot(df["month"], df["revenue"], marker="o", color="#2563eb")
axes[0].set_title("Revenue Trend")
axes[0].set_ylabel("Revenue (USD)")
axes[0].yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f"${x:,.0f}"))
axes[0].tick_params(axis="x", rotation=45)
axes[0].spines[["top", "right"]].set_visible(False)

# Paneel 2: Klantengroei
axes[1].bar(df["month"], df["customers"], color="#16a34a", width=20)
axes[1].set_title("Customer Growth")
axes[1].set_ylabel("Total Customers")
axes[1].tick_params(axis="x", rotation=45)
axes[1].spines[["top", "right"]].set_visible(False)

# Paneel 3: Verlooppercentage met drempelwaardenlijn
axes[2].plot(df["month"], df["churn_rate"], marker="s", color="#dc2626")
axes[2].axhline(y=0.05, color="gray", linestyle="--", label="Target: 5%")
axes[2].set_title("Monthly Churn Rate")
axes[2].set_ylabel("Churn Rate")
axes[2].yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f"{x:.1%}"))
axes[2].tick_params(axis="x", rotation=45)
axes[2].spines[["top", "right"]].set_visible(False)
axes[2].legend()

fig.suptitle("Product Dashboard — FY 2025", fontsize=14, fontweight="bold")
plt.tight_layout()
plt.savefig("interview_dashboard.png", dpi=150)
plt.show()

Deze oefening demonstreert drie grafiektypen in een uniform layout, correcte asformattering, een referentielijn voor churn-doelstellingen en consistente styling. Dit zijn precies de elementen waarop interviewers beoordelen.

Conclusie

  • De objectgeoriënteerde Matplotlib-API (fig, ax = plt.subplots()) biedt volledige controle en is de verwachte standaard in professionele omgevingen en interviews
  • Seaborns hue-parameter en ingebouwde statistische functies (KDE, heatmaps) verwerken gegroepeerde analyses met minimale code
  • Correlatie-heatmaps met divergerende kleurenpaletten en vaste schalen (vmin=-1, vmax=1) zijn een vast onderdeel van analytics-interviews
  • Roep altijd savefig() aan vóór show() om lege uitvoerbestanden te voorkomen
  • Strakke styling — verwijderde spines, geformatteerde tick-labels, expliciete titels — communiceert productieklaar denken naar interviewers
  • Oefen het bouwen van multi-paneel dashboards onder tijdsdruk: de meeste live coding-rondes reserveren 10-15 minuten per visualisatieopdracht

Tags

#python
#matplotlib
#seaborn
#data-visualization
#data-analytics
#interview

Delen

Gerelateerde artikelen