Plotly maakt interactieve grafieken die je kunt vergroten, roteren en boven aanhouden voor details โ allemaal zonder de code opnieuw uit te voeren. Dit maakt Plotly uitermate geschikt voor exploratieve data-analyse.
Waarom Plotly naast Matplotlib/Seaborn?
| Matplotlib / Seaborn | Plotly | |
|---|---|---|
| Output | Statische afbeelding | Interactief HTML-element |
| Zoomen / pannen | โ | โ |
| Hover-tooltips | โ | โ |
| Exploratie | Minder geschikt | Ideaal |
| Export | PNG, PDF | HTML, PNG |
We werken met plotly.express (alias px) โ de high-level API die voor de meeste gevallen voldoet.
import numpy as np
import pandas as pd
import plotly.express as px
import seaborn as sns
penguins = sns.load_dataset("penguins").dropna()
titanic = sns.load_dataset("titanic")
tips = sns.load_dataset("tips")Scatter plot โ px.scatterยถ
Hover over de punten om de waarden te bekijken. Klik op een item in de legenda om het te verbergen.
fig = px.scatter(
penguins,
x="bill_length_mm",
y="flipper_length_mm",
color="species", # color per category
symbol="sex", # marker shape per category
size="body_mass_g", # point size = body mass
hover_data=["island", "body_mass_g"], # extra info on hover
title="Penguins: bill length vs. flipper length",
labels={
"bill_length_mm": "Bill length (mm)",
"flipper_length_mm": "Flipper length (mm)",
},
)
fig.show()Histogram โ px.histogramยถ
fig = px.histogram(
penguins,
x="body_mass_g",
color="species",
nbins=30,
barmode="overlay", # overlapping bars (alternatives: "stack", "group")
opacity=0.7,
title="Body mass distribution per species",
labels={"body_mass_g": "Body mass (g)", "count": "Count"},
)
fig.show()Boxplot โ px.boxยถ
fig = px.box(
titanic,
x="pclass",
y="fare",
color="survived",
points="outliers", # show outlier points
title="Ticket price per class and survival status",
labels={
"pclass": "Class",
"fare": "Price (ยฃ)",
"survived": "Survived",
},
color_discrete_map={0: "#e74c3c", 1: "#2ecc71"},
)
fig.show()Lijnplot โ px.lineยถ
rng = np.random.default_rng(42)
months = pd.date_range("2023-01", periods=24, freq="ME")
revenue = pd.DataFrame(
{
"date": months,
"product_a": (rng.normal(100, 15, 24)).cumsum() + 500,
"product_b": (rng.normal(80, 20, 24)).cumsum() + 300,
}
)
# Convert to long format for Plotly
revenue_long = revenue.melt(id_vars="date", var_name="product", value_name="revenue")
fig = px.line(
revenue_long,
x="date",
y="revenue",
color="product",
markers=True,
title="Cumulative revenue per product",
labels={"date": "Date", "revenue": "Revenue (โฌ)"},
)
fig.show()Heatmap โ px.imshowยถ
Met px.imshow maak je een interactieve heatmap โ ideaal voor correlatiematrices.
corr = penguins.select_dtypes(include="number").corr().round(2)
fig = px.imshow(
corr,
text_auto=True, # show values in cells
color_continuous_scale="RdBu_r", # red = positive, blue = negative
zmin=-1,
zmax=1,
title="Correlation matrix โ penguins",
aspect="auto",
)
fig.show()Facets โ meerdere grafieken per groepยถ
Met facet_col of facet_row maak je automatisch meerdere subgrafieken, รฉรฉn per unieke waarde in een kolom.
fig = px.scatter(
penguins,
x="bill_length_mm",
y="body_mass_g",
color="sex",
facet_col="species", # one column per species
title="Bill length vs. body mass โ per species",
labels={
"bill_length_mm": "Bill length (mm)",
"body_mass_g": "Body mass (g)",
},
)
fig.show()Wanneer Matplotlib vs. Seaborn vs. Plotly?ยถ
| Situatie | Keuze |
|---|---|
| Statische figuur voor rapport/publicatie | Matplotlib of Seaborn |
| Statistische visualisatie (boxplot, pairplot, heatmap) | Seaborn |
| Exploratieve analyse โ interactie gewenst | Plotly |
| Tijdreeksdata met zoom | Plotly |
| Ingebedde visualisatie in dashboard (Dash/Streamlit) | Plotly |
Oefeningenยถ
Oefening 1 โ Maak een interactief scatter plot van de Tips-dataset met total_bill op de x-as, tip op de y-as, kleur per day en grootte proportioneel aan size (partijgrootte). Hover om de details per punt te zien.
# your solution hereOefening 2 โ Maak een interactief histogram van de leeftijdsverdeling van Titanic-passagiers (age), met een onderscheid per pclass. Gebruik barmode="overlay" en opacity=0.6.
# your solution hereOefening 3 โ Maak een interactieve correlatieheatmap voor de numerieke kolommen van de Titanic-dataset. Welke variabele heeft de sterkste negatieve correlatie met survived?
# your solution hereOefening 4 โ Maak een facet-scatter plot voor de Penguins-dataset met bill_depth_mm op x, bill_length_mm op y, kleur per sex, en een aparte kolom (facet_col) per island.
# your solution here