Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Hoofdstuk 24 — Visualisatie‑best practices en data storytelling

Let op: De tekst is in het Nederlands; alle Python codevoorbeelden zijn in het Engels.

Doel van dit hoofdstuk:

  • Leren kiezen van geschikte grafiekvormen voor verschillende vragen.
  • Best practices voor schaal, kleur, labels, ordening, en reductie van ruis.
  • Storytelling‑principes: context, focus, hiërarchie, en begeleidende annotaties.
  • Toegankelijkheid: kleurenblindvriendelijke paletten, fontgrootte, contrast.

Aanbevolen voorkennis: Hoofdstuk 21–23.

24.1 Kies de juiste grafiek voor de vraag

  • Vergelijking per categorie: staaf (bar), eventueel horizontaal (barh) voor lange labels.
  • Verdeling: histogram, KDE (via andere libs), box/violin voor meerdere groepen.
  • Relatie: scatter; met maat/kleur voor extra variabelen; hexbins/density bij overplotting.
  • Tijd: line (geen staaf), gebruik consistente tijdschaal en duidelijke ticks.

24.2 As‑schalen en baselines

  • Begin bij 0 voor staafdiagrammen (misleiding voorkomen), tenzij goed gemotiveerd met annotatie.
  • Log‑schalen voor multiplicatieve verhoudingen of grote orders van grootte.
  • Vermijd onnodige dubbele y‑assen; als gebruikt, label duidelijk en geef context.
import numpy as np
import matplotlib.pyplot as plt

x = np.logspace(0, 4, 200); y = 1/x
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8,3))
ax1.plot(x, y); ax1.set_title('Lineair')
ax2.loglog(x, y); ax2.set_title('Log–log')
fig.tight_layout()

24.3 Ordening, sortering en groepering

  • Sorteer categorieën op waarde of logische volgorde.
  • Groepeer gerelateerde elementen, gebruik tussenkopjes of subtiele grids.
  • Vermijd 3D‑staven en onnodige effecten; houd het vlak en leesbaar.
cats = ['C','A','B']; vals = [7,5,3]
order = np.argsort(vals)[::-1]
fig, ax = plt.subplots()
ax.bar(np.array(cats)[order], np.array(vals)[order])
ax.set_title('Gesorteerd')

24.4 Kleurgebruik en paletten

  • Gebruik kleur spaarzaam om nadruk te leggen; houd overige elementen grijs/blauwachtig (low‑saturation).
  • Kies kleurenblindvriendelijke paletten (bijv. Matplotlib tab10, tab20).
  • Gebruik semantische kleur (rood voor negatief, groen voor positief) consistent en met voldoende contrast.
fig, ax = plt.subplots()
vals = [5, 7, 3, 6]
colors = ['0.7','0.7','0.7','C3']  # highlight laatste balk
ax.bar(['Q1','Q2','Q3','Q4'], vals, color=colors)
ax.set_title('Highlight met kleur')

24.5 Labels, annotaties en data‑ink ratio

  • Label assen en units; voeg titel en subtitel toe voor context.
  • Direct labeling (lijnen voorzien van tekst) voorkomt legende‑sprongen.
  • Verhoog de data‑ink ratio: verwijder chartjunk, lichte grids, beperkte ticks.
x = np.linspace(0, 10, 200)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), color='C0')
ax.plot(x, np.cos(x), color='C1')
ax.text(10.1, np.sin(10), 'sin', color='C0', va='center')
ax.text(10.1, np.cos(10), 'cos', color='C1', va='center')
ax.legend().remove()
ax.grid(True, ls=':', alpha=0.4)

24.6 Onzekerheid tonen: error bars, band en bootstrap CI

  • Error bars (standaarddeviatie of standaardfout) op staaf of lijn.
  • Confidence band rond een trendlijn.
rng = np.random.default_rng(0)
x = np.linspace(0, 10, 50)
y = np.sin(x) + 0.2*rng.standard_normal(len(x))

fig, ax = plt.subplots()
ax.plot(x, y, color='C0', lw=1)
# Smooth gemiddelde en band (voorbeeld: eenvoudige rollende mean)
import pandas as pd
s = pd.Series(y).rolling(5, center=True, min_periods=1)
mean = s.mean().to_numpy(); std = s.std().fillna(0).to_numpy()
ax.fill_between(x, mean-2*std, mean+2*std, color='C0', alpha=0.2, label='±2σ')
ax.plot(x, mean, color='C0', lw=2, label='mean')
ax.legend()

24.7 Small multiples en facetting

  • Breek complexe verhalen op in kleine, vergelijkbare panelen.
  • Gebruik gedeelde assen en consistente schalen voor vergelijking.
import pandas as pd
cats = ['A','B','C','D']
fig, axes = plt.subplots(2, 2, figsize=(7,5), sharex=True, sharey=True)
for ax, c in zip(axes.ravel(), cats):
    x = np.linspace(0, 10, 100)
    ax.plot(x, np.sin(x)+(cats.index(c))*0.3)
    ax.set_title(f'Category {c}')
fig.suptitle('Small multiples'); fig.tight_layout()

24.8 Typografie, maatvoering en toegankelijkheid

  • Minimale fontgrootte 9–10 pt op scherm; groter voor projectie.
  • Gebruik dpi en figsize bewust; test export (PNG/PDF) op scherpte.
  • Gebruik markers/linestyles naast kleur om onderscheid te waarborgen.
  • Voeg alternatieve teksten/onderschriften toe buiten de figuur (documentatie).

24.9 Storytelling‑structuur

  • Begin met vraag of claim; geef context (units, periode, sampleomvang).
  • Presenteer de kernvisual met highlight/annotatie.
  • Geef nuance (onzekerheid, uitzonderingen) en next steps.

24.10 Checklist voor review

  • Is de grafiek het juiste type voor de vraag?
  • Zijn assen gelabeld met units? Zijn schalen passend (lineair/log)?
  • Is ordening logisch? Is kleurgebruik toegankelijk en betekenisvol?
  • Zijn ruis en chartjunk geminimaliseerd? Is onzekerheid duidelijk?

24.11 Samenvatting

  • Keuze van grafiektype, schaal en ordening bepaalt begrijpelijkheid.
  • Gebruik kleur en annotaties doelgericht, met aandacht voor toegankelijkheid.
  • Vertel een verhaal met context, highlight en nuance; vermijd chartjunk.