Visualiseren met Matplotlib en Seaborn
GemiddeldLes 7 van 8 in Cursus Data-analyse met Python: NumPy, pandas en visualisatie
Wat je leert
- Maak een figuur met grafiekgebieden via de objectgeoriënteerde interface van Matplotlib, teken daarin lijndiagrammen, spreidingsdiagrammen en staafdiagrammen en bepaal titels, labels, maatstreepjes, grenzen, legenda's en stijlen.
- Maak een figuur met grafiekgebiedenBegrijp hoe een grafiek in Matplotlib is opgebouwd uit een figuur, een of meer grafiekgebieden en de elementen die daarin worden getekend, en kies tussen pyplot en de objectgeoriënteerde manier om grafiekcode te schrijven.
- Teken lijndiagrammen en spreidingsdiagrammenTeken waarden langs een geordende as met
ax.ploten afzonderlijke waarnemingen metax.scatter, en bepaal kleur, lijnstijl, markeringen, markeringsgrootte en transparantie. - Vergelijk categorieën met staafdiagrammenTeken verticale, horizontale, gegroepeerde en gestapelde staafdiagrammen met
ax.barenax.barh, en voorzie de staven van hun waarden. - Voorzie een grafiek van labels, stel de schaal in en pas de stijl aanStel titels, aslabels, grenzen, maatstreepjes, de opmaak van aslabels, schalen, legenda's en rasters in, en verander het algemene uiterlijk van grafieken met stijlbladen en instellingen.
- Maak een figuur met grafiekgebieden
- Teken grafieken rechtstreeks vanuit Series en DataFrames met de
plot-methode van pandas en aggregeer, sorteer en herstructureer tabellen eerst, zodat elke grafiek de bedoelde waarden toont.- Gebruik de plot-methode van pandasMaak lijndiagrammen, staafdiagrammen, histogrammen, boxplots, vlakdiagrammen, cirkeldiagrammen en spreidingsdiagrammen vanuit een Series of DataFrame en pas de Matplotlib-grafiekgebieden aan die ze teruggeven.
- Herstructureer de gegevens voordat je een grafiek maaktAggregeer, tel, sorteer en zet een tabel om naar breed of lang formaat, zodat die precies de waarden bevat die een grafiek moet tonen, in het formaat dat pandas of seaborn verwacht.
- Gebruik de plot-methode van pandas
- Gebruik seaborn om DataFrame-kolommen te koppelen aan posities, kleuren en stijlen, toon verbanden tussen numerieke variabelen met samenvattingen van trends en vergelijk groepen met grafieken voor categorische gegevens.
- Koppel kolommen aan visuele kenmerken in seabornGeef DataFrame-kolommen op voor positie, kleur, stijl en grootte, onderscheid functies voor één grafiekgebied van functies voor een volledige figuur en stel seaborn-thema's en -paletten in.
- Toon verbanden tussen numerieke variabelenTeken met seaborn spreidingsdiagrammen, geaggregeerde lijndiagrammen met onzekerheidsbanden, regressielijnen en matrices van spreidingsdiagrammen, en lees wat de banden en lijnen wel en niet tonen.
- Vergelijk groepen met grafieken voor categorische gegevensVergelijk een numerieke variabele tussen categorieën met staafdiagrammen, frequentiestaafdiagrammen, puntdiagrammen, puntenstrookdiagrammen en zwermdiagrammen, en kies hun schatter, foutbalken, volgorde en oriëntatie.
- Koppel kolommen aan visuele kenmerken in seaborn
- Toon hoe een numerieke variabele is verdeeld met histogrammen, dichtheidskrommen, boxplots en viooldiagrammen, en geef een tabel met waarden of correlaties weer als hittekaart.
- Toon een verdeling met histogrammen en dichtheidskrommenMaak histogrammen in Matplotlib, pandas en seaborn, kies klassen en schalen en voeg afgevlakte dichtheidskrommen toe of vergelijk ze.
- Vat verdelingen samen en vergelijk ze met boxplotsLees en teken boxplots op basis van kwartielen en de 1,5 × IQR-regel, vergelijk er groepen mee en gebruik viooldiagrammen en puntenstrookdiagrammen om te tonen wat een box verbergt.
- Geef een waardenraster weer als hittekaartZet een draaitabel of correlatiematrix om in een hittekaart met seaborn of Matplotlib en bepaal annotaties, getalnotaties, kleurenschalen en grenzen van de kleurenschaal.
- Toon een verdeling met histogrammen en dichtheidskrommen
- Rangschik herhaalde deelgrafieken met Matplotlib-subplots en deelgrafieken per groep in seaborn, wijs met tekst, pijlen en referentielijnen op wat belangrijk is en sla figuren op in het juiste formaat en de juiste grootte voor rapporten en het web.
- Rangschik meerdere grafieken in één figuurMaak rasters van grafiekgebieden met
plt.subplots, deel schalen tussen deelgrafieken, vul de deelgrafieken in een lus, pas tussenruimte en titels aan en maak deelgrafieken van ongelijke grootte. - Verdeel gegevens met seaborn over deelgrafieken per groepVerdeel een grafiek in deelgrafieken op basis van één of twee categorische variabelen met de argumenten
col,rowencol_wrapvan functies voor een volledige figuur of metFacetGrid, en pas het resulterende raster aan. - Voeg annotaties en referentielijnen toePlaats tekst, pijlen, referentielijnen, gearceerde bereiken en waardelabels in een grafiek, in gegevenscoördinaten of in coördinaten relatief aan het grafiekgebied.
- Sla figuren op voor rapporten en het webExporteer figuren met
savefigin raster- of vectorformaten, bepaal grootte, resolutie, marges en achtergrond en sla op het juiste moment op in scripts, notebooks en lussen.
- Rangschik meerdere grafieken in één figuur
Matplotlib en Seaborn: uitleg
1Maak grafieken met figuren en grafiekgebieden van Matplotlib
Een grafiekopdracht heeft een plek nodig om te tekenen. Matplotlib maakt die plek expliciet: een figuur bevat een of meer grafiekgebieden en elk gebied bevat de getekende elementen en labels. Begin met één gebied en gebruik daarna dezelfde objecten om lijnen, punten, staven en nuttige instellingen toe te voegen. Als je de figuur en elk grafiekgebied een naam geeft, kun je gemakkelijker de juiste grafiek aanpassen wanneer een notebook groeit of een figuur meerdere deelgrafieken bevat.
1.1 Maak een figuur met grafiekgebieden
Matplotlib is de standaardbibliotheek voor grafieken in Python; zowel pandas als seaborn tekent ermee. De gebruikelijke import is import matplotlib.pyplot as plt. In een Jupyter-notebook verschijnt een grafiek onder de cel die de grafiek tekent; in een script toont plt.show() de open figuren en wacht in een normaal script tot de vensters zijn gesloten.
Een figuur is het volledige canvas: de afbeelding die wordt getoond of opgeslagen. Een grafiekgebied is één gebied binnen de figuur waarin een grafiek wordt getekend, met eigen gegevens, een titel, aslabels en grenzen; één figuur kan er meerdere bevatten. Een as is één getallenas van een grafiekgebied, de x-as of de y-as, met maatstreepjes en bijbehorende labels. Elk zichtbaar element, zoals een lijn, markering, tekst of staaf, heet een grafisch object.
fig, ax = plt.subplots() maakt een figuur met één grafiekgebied en geeft beide objecten terug. figsize=(width, height) stelt de figuurafmetingen in inches in. De standaard is 6,4 × 4,8 inch bij 100 punten per inch, dus een standaardfiguur is 640 × 480 pixels op het scherm; plt.subplots(figsize=(8, 4)) maakt een bredere, plattere figuur.
Matplotlib biedt twee stijlen. In de objectgeoriënteerde stijl roep je methoden aan op expliciete objecten: ax.plot(...), ax.set_title(...). In de pyplot-stijl werken functies zoals plt.plot(...) en plt.title(...) op het “huidige” grafiekgebied, meestal het laatst aangemaakte. Beide tekenen dezelfde grafieken; de objectgeoriënteerde stijl is duidelijker zodra een figuur meer dan één grafiekgebied heeft of grafiekcode in een functie staat, dus deze cursus gebruikt die stijl.
De twee stijlen gebruiken verschillende namen voor dezelfde instellingen: plt.title, plt.xlabel en plt.xlim komen overeen met ax.set_title, ax.set_xlabel en ax.set_xlim. Een veelgemaakte fout is ax.title("Rainfall"): bij een grafiekgebied is title een attribuut dat een tekstobject bevat, dus aanroepen geeft TypeError: 'Text' object is not callable. Gebruik ax.set_title("Rainfall").
months = [1, 2, 3, 4, 5, 6]; temp_c = [3, 5, 9, 13, 17, 20], daarna
fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(months, temp_c)
ax.set_title("Mean monthly temperature")
ax.set_xlabel("Month")
ax.set_ylabel("Temperature (°C)")
.
Tekenaanroepen voegen iets toe aan een grafiekgebied; ze vervangen niet wat er al staat. Een tweede ax.plot(...) op dezelfde ax voegt een tweede lijn aan dezelfde grafiek toe. Voor een aparte grafiek maak je een nieuwe figuur met nog een aanroep van plt.subplots(), of teken je in een ander grafiekgebied van een figuur met meerdere deelgrafieken.
pyplot houdt elke figuur die het heeft gemaakt open totdat je die sluit met plt.close(fig) of plt.close("all"). Open figuren gebruiken geheugen en zodra er meer dan 20 open zijn, waarschuwt Matplotlib daarvoor. Code die in een lus figuren maakt, moet elke figuur na het opslaan sluiten.
Belangrijkste punten
- Een figuur is het canvas; een grafiekgebied is een gebied waarin een grafiek wordt getekend.
- Roep methoden aan op het grafiekgebied dat je wilt wijzigen.
- Opnieuw tekenen in hetzelfde grafiekgebied voegt grafische objecten toe.
- Sluit opgeslagen figuren in lussen.
1.2 Teken lijndiagrammen en spreidingsdiagrammen
ax.plot(x, y) tekent markeringen of rechte lijnstukken die de punten verbinden in de opgegeven volgorde. Een lijndiagram past bij een grootheid die is gemeten langs een geordende variabele zoals tijd of afstand. Met één argument, ax.plot(y), zijn de standaardwaarden voor x 0, 1, 2, ….
Omdat punten in de opgegeven volgorde worden verbonden, leveren ongesorteerde x-waarden een zigzaglijn op die heen en weer over de grafiek loopt. Bij x = [3, 1, 2] loopt de lijn van x = 3 terug naar x = 1 en vervolgens vooruit naar x = 2. Sorteer de gegevens eerst op x, bijvoorbeeld met df.sort_values("x").
Stijlargumenten: color (een naam zoals "black" of "tab:orange", of een hexcode zoals "#1f77b4"), linestyle ("-" doorgetrokken, "--" gestreept, ":" gestippeld, "-." streep-punt), linewidth, marker ("o" cirkel, "s" vierkant, "^" driehoek) en markersize. Een korte opmaaktekenreeks combineert markering en lijnstijl: ax.plot(x, y, "o--") tekent cirkels die met een streeplijn zijn verbonden. Zonder color krijgt elke nieuwe lijn de volgende kleur uit de standaardreeks, die begint met "tab:blue" en "tab:orange".
Geef elke lijn een label en roep ax.legend() aan om een legenda te tonen:
ax.plot(months, north, marker="o", label="North")
ax.plot(months, coast, linestyle="--", label="Coast")
ax.legend()
. Als geen enkel grafisch object een label heeft, tekent ax.legend() niets en waarschuwt Matplotlib dat er geen grafische objecten met labels zijn gevonden.
ax.scatter(x, y) tekent per waarneming één losse markering en past bij het verband tussen twee numerieke variabelen. Voorbeeld: dagtemperatuur [12, 15, 18, 21, 24, 27, 30, 22] °C en fietsverhuur [180, 220, 260, 310, 330, 360, 340, 250]; ax.scatter(temp_c, rentals) laat zien dat de fietsverhuur meestal stijgt met de temperatuur en de correlatie van de twee lijsten is ongeveer 0,92.
In ax.scatter bepaalt s de oppervlakte van elke markering in kwadraatpunten; de standaardwaarde is 36, de oppervlakte van een markering van 6 punten breed. Als je s verdubbelt, verdubbelt de oppervlakte, dus de breedte van de markering neemt slechts met een factor van ongeveer 1,4 toe. s kan één getal zijn of één waarde per punt, zodat de markeringsgrootte een derde variabele kan tonen.
c kleurt de punten: één kleur voor alle punten, of één getal per punt dat via een kleurenschaal zoals cmap="viridis" aan een kleur wordt gekoppeld. Bewaar het teruggegeven object en voeg een kleurenbalk toe: sc = ax.scatter(temp_c, rentals, c=rain_mm, cmap="viridis"); fig.colorbar(sc, ax=ax, label="Rain (mm)").
Als veel punten elkaar overlappen, veranderen dichtbevolkte gebieden in dichte vlekken en is niet meer te zien hoeveel punten ze bevatten. Verlaag de dekking met alpha=0.3, gebruik kleinere markeringen of toon in plaats daarvan de dichtheid, bijvoorbeeld met een grafiek met zeshoekige klassen (df.plot.hexbin) of een tweedimensionaal histogram.
ax.plot(x, y, "o") met een markering en zonder lijn tekent ook punten en is sneller bij zeer veel punten, omdat alle markeringen dezelfde grootte en kleur hebben. Gebruik ax.scatter als de grootte of kleur per punt moet verschillen.
Belangrijkste punten
- Lijnen verbinden punten in de opgegeven volgorde.
- De grootte van een spreidingsmarkering is een oppervlakte in kwadraatpunten.
- Een koppeling van numerieke waarden aan kleuren heeft een kleurenbalk nodig.
- Gebruik labels en een legenda om reeksen te herkennen.
- Transparantie helpt om overlappende waarnemingen zichtbaar te maken.
1.3 Vergelijk categorieën met staafdiagrammen
ax.bar(categories, heights) tekent één verticale staaf per categorie; ax.barh(categories, widths) tekent horizontale staven, die ruimte laten voor lange categorienamen. Als de categorieën tekenreeksen zijn, plaatst Matplotlib ze op gelijke afstand in de opgegeven volgorde en gebruikt ze als labels bij de maatstreepjes. Zijn het getallen, dan staan de staven op die numerieke posities op een gewone getallenas.
Staven beginnen standaard bij een basislijn van 0, zodat de lengte van een staaf de waarde toont. Het argument width wordt gemeten in eenheden van de x-as en is standaard 0,8. Categorieën als tekenreeksen worden op één eenheid afstand geplaatst, dus de standaardwaarde laat een ruimte van 0,2 tussen de staven; met width=1 raken aangrenzende staven elkaar.
Aan 200 forensen is gevraagd hoe ze gewoonlijk reizen: auto 84, bus 52, fiets 38, lopen 26. ax.barh(["Car", "Bus", "Bike", "Walk"], [84, 52, 38, 26]) tekent vier horizontale staven. De aandelen zijn 42%, 26%, 19% en 13%, samen 100%.
ax.barh zet de eerste categorie onderaan de as, omdat de y-as naar boven oploopt. Om een gerangschikte lijst van bovenaf te lezen, zoals in het voorbeeld over woon-werkverkeer, roep je ax.invert_yaxis() aan of keer je zowel de categorieën als hun waarden om voordat je de grafiek tekent, zodat elke waarde bij de bijbehorende categorie blijft.
Gegroepeerde staven plaatsen meerdere reeksen naast elkaar binnen elke categorie. Gebruik numerieke posities en verschuif elke reeks met een halve staafbreedte:
x = np.arange(3)
ax.bar(x - 0.2, north, width=0.4, label="North")
ax.bar(x + 0.2, coast, width=0.4, label="Coast")
ax.set_xticks(x, labels=["Jan", "Feb", "Mar"])
ax.legend()
. De staven voor North staan op −0,2, 0,8 en 1,8, die voor Coast op 0,2, 1,2 en 2,2, gecentreerd rond elk maatstreepje.
Gestapelde staven tekenen met bottom= een tweede reeks boven op de eerste: ax.bar(days, car); ax.bar(days, bus, bottom=car). Als er op een dag 40 autoritten en 25 busritten zijn, loopt het busdeel van 40 tot 65 en is de totale staafhoogte 65.
bars = ax.bar(...) geeft een verzameling staven terug; ax.bar_label(bars) schrijft elke waarde aan het uiteinde van de bijbehorende staaf. fmt bepaalt de tekst: fmt="%.1f" schrijft 3,14 als “3.1” en fmt="{:.0f} km" schrijft die als “3 km”.
Matplotlib tekent staven in de volgorde van de gegevens, niet op grootte. Sorteer voor een gerangschikte grafiek eerst de waarden, bijvoorbeeld met sorted() op paren of sort_values() in pandas. Het argument yerr= voegt aan elke staaf foutbalken met een opgegeven lengte toe; ax.errorbar(x, y, yerr=...) doet hetzelfde voor punten.
Een staafdiagram vergelijkt waarden van afzonderlijke categorieën, dus de staven staan met tussenruimten van elkaar. Een histogram toont daarentegen hoe één numerieke variabele over aangrenzende intervallen is verdeeld, en de staven raken elkaar. Metingen tekenen als één staaf per gegevensrij levert een staafdiagram van ruwe waarden op, geen histogram.
Belangrijkste punten
- Houd categorieën bij het sorteren gekoppeld aan hun waarden.
- Gegroepeerde staven gebruiken verschuivingen rond de maatstreepjes van de categorieën.
- Gestapelde staven gebruiken cumulatieve ondergrenzen.
- Staaflabels horen bij de teruggegeven verzameling staven.
1.4 Voorzie een grafiek van labels, stel de schaal in en pas de stijl aan
Stel tekst in met ax.set_title("..."), ax.set_xlabel("...") en ax.set_ylabel("..."), of met één aanroep: ax.set(title="Monthly rainfall", xlabel="Month", ylabel="Rainfall (mm)"). Zet de eenheid in het aslabel, bijvoorbeeld “Neerslag (mm)” of “Afstand (km)”, zodat elke waarde bij een maatstreepje betekenis heeft.
Matplotlib kiest de asgrenzen op basis van de gegevens met een kleine marge. Stel ze zelf in met ax.set_xlim(1, 12) en ax.set_ylim(0, 120), of leg alleen één uiteinde vast met ax.set_ylim(bottom=0). ax.set(xlim=(1, 12), ylim=(0, 120)) doet hetzelfde in één aanroep.
ax.set_xticks([1, 4, 7, 10]) kiest de posities van de maatstreepjes en ax.set_xticks([1, 2, 3], labels=["Jan", "Feb", "Mar"]) vervangt ook hun labels. Draai labels die te dicht op elkaar staan met ax.tick_params(axis="x", labelrotation=45). Opmaakfuncties voor aslabels veranderen hoe waarden worden geschreven: ax.yaxis.set_major_formatter(PercentFormatter(xmax=1, decimals=0)), met PercentFormatter geïmporteerd uit matplotlib.ticker, geeft de waarde 0,25 het label “25%”.
ax.set_yscale("log") zet de y-as op een logaritmische schaal, waarbij gelijke afstanden staan voor gelijke verhoudingen: de stap van 10 naar 100 is even lang als die van 100 naar 1.000. Dit past bij waarden die meerdere ordes van grootte beslaan, zoals inwoneraantallen van steden. Een logaritmische as kan geen nul of negatieve waarden tonen.
ax.legend() plaatst de legenda waar die de minste punten bedekt (loc="best", de standaard voor een legenda in een grafiekgebied). Kies een plek met loc="upper left", voeg een kop toe met title="Station" en verdeel de items over kolommen met ncols=2. ax.legend(bbox_to_anchor=(1.02, 1), loc="upper left") plaatst de legenda net buiten de rechterrand van het grafiekgebied.
ax.grid(True, alpha=0.3) voegt lichte rasterlijnen toe bij de maatstreepjes; ax.grid(axis="y") tekent alleen horizontale lijnen, wat helpt bij het aflezen van staafhoogtes.
Stijlbladen veranderen het standaarduiterlijk van elke volgende grafiek: plt.style.use("ggplot"). plt.style.available toont de geïnstalleerde stijlen; de stijlen die op seaborn lijken en met Matplotlib worden meegeleverd, heten bijvoorbeeld "seaborn-v0_8-whitegrid". Gebruik with plt.style.context("ggplot"): om een stijl alleen op één codeblok toe te passen.
Afzonderlijke standaardinstellingen staan in plt.rcParams, bijvoorbeeld plt.rcParams["font.size"] = 12 of plt.rcParams["figure.figsize"] = (8, 4). Ze gelden voor figuren die daarna worden gemaakt en plt.rcdefaults() herstelt de standaardinstellingen van Matplotlib.
fig, ax = plt.subplots(figsize=(8, 4))
ax.plot([1, 2, 3, 4], [62, 48, 55, 40], marker="o", label="North")
ax.set(title="Monthly rainfall, January to April", xlabel="Month", ylabel="Rainfall (mm)", ylim=(0, 70))
ax.set_xticks([1, 2, 3, 4], labels=["Jan", "Feb", "Mar", "Apr"])
ax.legend()
ax.grid(axis="y", alpha=0.3)
.
In een figuur met meerdere grafiekgebieden veranderen pyplot-functies zoals plt.title of plt.xlabel alleen het huidige grafiekgebied, meestal het laatst aangemaakte. Daardoor kan een titel in de verkeerde deelgrafiek terechtkomen. Door de methoden van het bedoelde grafiekgebied aan te roepen, zoals axes[0].set_title(...), voorkom je dit.
Belangrijkste punten
- De opmaak van aslabels verandert labels zonder de waarden te veranderen.
- Logaritmische schalen tonen gelijke verhoudingen als gelijke afstanden.
- Stijlen en rcParams stellen standaardwaarden in voor latere grafieken.
2Maak grafieken rechtstreeks vanuit pandas
Een pandas-tabel bevat vaak al de labels en waarden die een grafiek nodig heeft. De grafiekmethoden gebruiken die labels om een Matplotlib-grafiek te maken, die je daarna met dezelfde methoden kunt afwerken als een zelf opgebouwde grafiek. Het belangrijkste werk gebeurt vaak vóór het tekenen: bepalen wat één rij voorstelt, de juiste samenvatting berekenen en de tabel zo indelen dat groepen, reeksen en hun volgorde bij de vraag passen.
2.1 Gebruik de plot-methode van pandas
Maak de brede neerslagtabel met één kolom per station:
import pandas as pd
wide = pd.DataFrame({
"North": [62, 48, 55, 40],
"Coast": [110, 95, 80, 60],
"Valley": [20, 15, 30, 45]
}, index=pd.Index(["Jan", "Feb", "Mar", "Apr"], name="month"))
Elke pandas-Series en elk pandas-DataFrame heeft een .plot-methode die met Matplotlib tekent en het Matplotlib-grafiekgebied teruggeeft waarin is getekend. df.plot(kind="bar") en df.plot.bar() zijn dezelfde aanroep. De typen zijn "line" (de standaard), "bar", "barh", "hist", "box", "kde" of "density", "area", "pie", "scatter" en "hexbin".
Standaard wordt de index de x-as en wordt elke numerieke kolom een lijn, met een legenda op basis van de kolomnamen. Een Series zet de waarden uit tegen de index. Om kolommen te kiezen geef je x="month" en y="rain_mm" door, of een lijst zoals y=["North", "Coast"].
Een tabel wide met de index Jan, Feb, Mar, Apr en de kolommen North [62, 48, 55, 40], Coast [110, 95, 80, 60] en Valley [20, 15, 30, 45], allemaal in millimeters neerslag. ax = wide.plot(marker="o", figsize=(8, 4), title="Monthly rainfall"); ax.set_ylabel("Rainfall (mm)") tekent drie lijnen met labels in één grafiekgebied en stelt daarna het y-label in met een gewone Matplotlib-methode.
Veelgebruikte argumenten van .plot: title, xlabel, ylabel, xlim, ylim, figsize, color, legend=False, rot (draaiing van de labels bij maatstreepjes in graden), grid=True en logy=True. Met ax= teken je in een bestaand grafiekgebied, bijvoorbeeld een deelgrafiek van plt.subplots(1, 2), in plaats van in een nieuwe figuur.
subplots=True tekent elke kolom in een eigen grafiekgebied en geeft een NumPy-array van grafiekgebieden terug in plaats van één grafiekgebied; layout=(2, 2) rangschikt ze in een raster en sharey=True geeft ze een gezamenlijke y-schaal. Voor de tabel met drie stations geeft wide.plot(subplots=True, layout=(1, 3), sharey=True) één deelgrafiek per station.
Spreidingsdiagrammen en grafieken met zeshoekige klassen bestaan alleen voor DataFrames en hebben zowel x als y nodig: days.plot.scatter(x="temp_c", y="rentals", c="rain_mm", colormap="viridis") kleurt de punten naar neerslag. Een Series heeft geen spreidingsdiagram, dus s.plot.scatter() geeft een fout. df.plot.hist(bins=5) en df.plot.box() geven van elke numerieke kolom een histogram en een boxplot.
s.plot.pie() tekent per waarde een sector, waarvan de grootte het aandeel in het totaal weergeeft. Omdat cirkeldiagrammen een Series met niet-negatieve delen van één geheel nodig hebben, is een kolom met aantallen zoals s.value_counts() een gebruikelijke invoer.
Staafdiagrammen in pandas behandelen de index als categorieën en plaatsen de staven op posities 0, 1, 2, …, ongeacht de indexwaarden. Lijndiagrammen gebruiken de werkelijke indexwaarden als die getallen of datums zijn. Een lijn en staven uit pandas die in hetzelfde grafiekgebied zijn getekend, vallen daarom alleen samen als de x-waarden van de lijn overeenkomen met de staafposities, zoals bij een standaardindex 0, 1, 2, …; bij jaren zoals 2020 tot en met 2023 ligt de lijn ver rechts van de staven. Zet beide uit tegen dezelfde posities als je ze combineert.
Met een DatetimeIndex zet .plot() datums op de x-as en voorziet ze automatisch van labels. Daggegevens worden vaak duidelijker na resampling, bijvoorbeeld naar maandgemiddelden met s.resample("MS").mean().plot().
.plot tekent alleen numerieke kolommen. Als getallen als tekst zijn ingelezen, bijvoorbeeld omdat een kolom “12 mm” bevat, wordt de kolom overgeslagen. Als er geen numerieke gegevens overblijven, geeft pandas TypeError: no numeric data to plot. Converteer de kolom eerst, bijvoorbeeld met pd.to_numeric(...).
Belangrijkste punten
- Pandas tekent numerieke gegevens en gebruikt standaard de index.
- Geef een grafiekgebied door met
ax=om een deelgrafiek opnieuw te gebruiken. - Afzonderlijke deelgrafieken geven een array van grafiekgebieden terug.
- Pandas gebruikt voor staven en numerieke lijnen verschillende positieregels.
2.2 Herstructureer de gegevens voordat je een grafiek maakt
Een grafiek tekent de waarden die in de tabel staan, dus vat eerst samen. Voorbeeld: een lange tabel rain met 12 rijen, één per station en maand, en de kolommen month, station en rain_mm. rain.groupby("station")["rain_mm"].mean() geeft één gemiddelde per station: Coast 86,25 mm, North 51,25 mm en Valley 27,5 mm. Door .plot.bar() toe te voegen teken je drie staven.
Als je per ongeluk de ruwe rijen tekent, krijg je afzonderlijke metingen in plaats van de gevraagde gemiddelden: rain.plot.bar(x="station", y="rain_mm") tekent 12 staven met herhaalde stationsnamen in plaats van drie gemiddelden.
Sorteer vóór het tekenen om gerangschikte staven te krijgen: means.sort_values(ascending=False).plot.bar() zet het grootste gemiddelde links. Voor een horizontale grafiek zet means.sort_values().plot.barh() het grootste gemiddelde bovenaan, omdat de eerste waarde onderaan wordt getekend.
s.value_counts() telt hoe vaak elke categorie voorkomt en geeft de aantallen van meest naar minst voorkomend. Voor de vervoerswijzen “bus”, “auto”, “bus”, “fiets”, “bus”, “auto” geeft dit bus 3, auto 2, fiets 1, klaar voor .plot.bar(). Gebruik .sort_index() of .reindex([...]) als de categorieën een natuurlijke volgorde hebben, zoals dagen van de week.
Een DataFrame in breed formaat, met één kolom per reeks, geeft in pandas per kolom één lijn of staafkleur. Zet een lange tabel om met rain.pivot(index="month", columns="station", values="rain_mm"). Als een combinatie van index en kolom meer dan eens voorkomt, geeft pivot een fout; gebruik dan pivot_table(..., aggfunc="mean") of groupby(["month", "station"])["rain_mm"].mean().unstack().
pivot en pivot_table sorteren de nieuwe index, zodat maanden als tekenreeksen in alfabetische volgorde verschijnen: Apr, Feb, Jan, Mar. Een lijndiagram loopt dan in de verkeerde volgorde door de maanden. Herstel de werkelijke volgorde met wide.reindex(["Jan", "Feb", "Mar", "Apr"]), of sla de maand vóór het omzetten op als geordende categorische variabele of als maandnummer.
Bij een brede tabel tekent wide.plot.bar() gegroepeerde staven, één groep per indexlabel en één kleur per kolom, terwijl wide.plot.bar(stacked=True) de kolommen stapelt. De getransponeerde tabel wide.T.plot.bar() wisselt de rollen om: één groep per station, één kleur per maand.
Normaliseer een kruistabel voor aandelen binnen elke groep: pd.crosstab(trips["region"], trips["mode"], normalize="index") deelt elk aantal door het rijtotaal, zodat elke rij optelt tot 1. Als regio N twee autoritten en één busrit heeft, bevat de rij auto 0,67 en bus 0,33 (afgerond). .plot.bar(stacked=True) tekent dan staven met dezelfde totale hoogte die de samenstelling van elke regio tonen.
seaborn werkt het best met gegevens in lang formaat: één rij per waarneming en één kolom per variabele. wide.reset_index().melt(id_vars="month", var_name="station", value_name="rain_mm") zet de brede tabel van 4 × 3 terug om in 12 rijen met drie kolommen, zodat station kan worden gebruikt voor kleur of deelgrafieken per groep.
Belangrijkste punten
- Aggregeer rijen voordat je de gevraagde samenvatting tekent.
- Een dubbele combinatie bij pivoteren vereist een aggregatieregel.
- Breed formaat past bij reeksen in kolommen; lang formaat past bij koppelingen aan visuele kenmerken.
- Herstel na het herstructureren een betekenisvolle categorievolgorde.
- Normaliseer elke rij om groepsaandelen te vergelijken.
3Maak statistische grafieken met seaborn
Statistische grafieken koppelen tabelkolommen aan visuele kenmerken en berekenen vaak tijdens het tekenen een samenvatting. Seaborn voert beide taken uit via benoemde argumenten. Een korte aanroep kan groepen in verschillende kleuren tonen, herhaalde waarnemingen middelen of een tabel in deelgrafieken verdelen. Let goed op deze standaardinstellingen: een grafiek met afzonderlijke waarnemingen en een grafiek met groepsgemiddelden kunnen uitgaan van dezelfde rijen, maar verschillende vragen beantwoorden.
3.1 Koppel kolommen aan visuele kenmerken in seaborn
seaborn is een grafiekbibliotheek die op Matplotlib is gebouwd, rechtstreeks met pandas-DataFrames werkt en zelf veelgebruikte statistische samenvattingen berekent. De gebruikelijke import is import seaborn as sns. Een typische aanroep noemt de tabel en de kolommen: sns.scatterplot(data=days, x="temp_c", y="rentals").
Naast x en y kun je kolommen aan andere kenmerken koppelen: hue bepaalt de kleur, style de markering of het streeppatroon en size de markeringsgrootte of lijnbreedte. seaborn kiest zelf de kleuren en maakt de legenda. Een categorische hue-kolom krijgt afzonderlijke kleuren; een numerieke krijgt een kleurverloop.
Elke koppeling vereist een kolom in lang formaat. Met de lange neerslagtabel tekent sns.lineplot(data=rain, x="month", y="rain_mm", hue="station", marker="o") per station een gekleurde lijn met een legenda. Als hue een kolom noemt die niet in de tabel staat, geeft seaborn een ValueError met de melding dat de waarde niet kon worden geïnterpreteerd.
Als x tekenreeksen bevat, plaatst seaborn de categorieën in de volgorde waarin ze voor het eerst in de gegevens voorkomen. Maanden die in die rijvolgorde zijn opgeslagen als “Jan”, “Feb”, “Mar” blijven dus in kalendervolgorde. De functies voor categorische gegevens, zoals barplot, boxplot en countplot, accepteren order=["Mon", "Tue", "Wed"] om de categorievolgorde in te stellen. hue_order bepaalt de volgorde van de kleurgroepen in elke functie met hue. lineplot heeft geen argument order: maak de x-kolom daar een geordende categorische variabele om de volgorde van maandnamen vast te leggen, bijvoorbeeld pd.Categorical(rain["month"], categories=["Jan", "Feb", "Mar", "Apr"], ordered=True).
Functies voor één grafiekgebied, zoals scatterplot, lineplot, histplot, boxplot, barplot en heatmap, tekenen in één Matplotlib-grafiekgebied, accepteren ax= om dat grafiekgebied te kiezen en geven het terug. Functies voor een volledige figuur, relplot, displot, catplot en lmplot, maken hun eigen figuur, kunnen die met col en row in deelgrafieken verdelen en geven een seaborn-FacetGrid-object terug.
Bij functies voor een volledige figuur stel je de grootte per deelgrafiek in: height is de hoogte van elke deelgrafiek in inches en aspect de breedte-hoogteverhouding, dus elke deelgrafiek is height × aspect inch breed; de standaardwaarden zijn 5 en 1. Omdat deze functies hun eigen figuur maken, kunnen ze niet in een bestaand grafiekgebied tekenen: relplot, displot en catplot waarschuwen en negeren ax=, en lmplot wijst het af met een TypeError. Ze plaatsen de legenda buiten de deelgrafieken.
sns.set_theme() geeft alle volgende grafieken, ook gewone Matplotlib-grafieken, het uiterlijk van seaborn: de stijl “darkgrid”, de context “notebook” en het standaardpalet van seaborn. style kan “darkgrid”, “whitegrid”, “dark”, “white” of “ticks” zijn; context kan “paper”, “notebook”, “talk” of “poster” zijn en schaalt lettertypen en lijnen, bijvoorbeeld van een basislettergrootte van 12 punten voor “notebook” naar 18 punten voor “talk”.
palette kiest de kleuren voor hue, bijvoorbeeld palette="colorblind", "Set2" of "viridis". In seaborn 0.13 is het doorgeven van palette zonder hue verouderd; om staven per categorie te kleuren, stel je hue in op dezelfde kolom als x en voeg je legend=False toe: sns.barplot(data=rain, x="station", y="rain_mm", hue="station", legend=False).
Je kunt het resultaat afwerken met Matplotlib:
ax = sns.scatterplot(...)
ax.set(xlabel="Temperature (°C)", ylabel="Rentals per day", title="Rentals and temperature")
. Gebruik voor het resultaat van een functie voor een volledige figuur de methoden van het raster, zoals g.set_axis_labels("Temperature (°C)", "Rentals per day"), en g.figure.suptitle("...") voor een overkoepelende titel.
Belangrijkste punten
- Koppelingen aan visuele kenmerken verbinden kolommen met kenmerken van de grafiek.
- Functies voor één grafiekgebied accepteren een bestaand grafiekgebied.
- Functies voor een volledige figuur maken hun eigen deelgrafieken en bepalen de grootte ervan.
- Thema's beïnvloeden latere grafieken van beide bibliotheken.
3.2 Toon verbanden tussen numerieke variabelen
sns.scatterplot(data=days, x="temp_c", y="rentals", hue="weekday", size="rain_mm") tekent één punt per rij, waarvan kleur en grootte worden bepaald door andere kolommen. Als je hue en style met dezelfde kolom combineert, krijgt elke groep een eigen kleur en markering, die ook in grijstinten te onderscheiden zijn.
sns.lineplot aggregeert standaard: als meerdere rijen dezelfde x-waarde hebben, tekent de functie de lijn door het gemiddelde van hun y-waarden en kleurt een band voor het 95%-betrouwbaarheidsinterval van dat gemiddelde, berekend met bootstrapping. Uitgewerkt voorbeeld: bij x = 1 zijn de y-waarden 10, 12 en 14, bij x = 2 zijn ze 20, 21 en 25; de lijn loopt door 12 en 22.
De standaardband toont de onzekerheid van elk gemiddelde, niet het bereik van de gegevens. errorbar="sd" kleurt in plaats daarvan een band van één standaardafwijking boven en onder het gemiddelde, errorbar=None verwijdert de band en estimator=None tekent samen met units= elke afzonderlijke reeks zonder te middelen. Met één rij per x-waarde valt er niets te middelen en is er geen band.
sns.regplot(data=days, x="temp_c", y="rentals") tekent een spreidingsdiagram met een rechte lijn volgens de kleinste-kwadratenmethode en een ingekleurde 95%-betrouwbaarheidsband voor die lijn; order=2 past in plaats daarvan een kwadratische kromme aan. sns.lmplot doet hetzelfde als functie voor een volledige figuur en kan de gegevens dus ook verdelen met hue, col of row.
Een aangepaste lijn vat de gegevens samen met het model dat je hebt gekozen. Een rechte lijn kan door krom verlopende gegevens worden getekend, dus bekijk de punten rond de lijn voordat je erop vertrouwt. Een sterke trend toont dat de variabelen in deze gegevens samenhangen, zonder een oorzaak vast te stellen.
sns.pairplot(df) tekent een raster met een spreidingsdiagram voor elk paar numerieke kolommen en de verdeling van elke kolom op de diagonaal: standaard histogrammen, en dichtheidskrommen als hue is ingesteld. Vier numerieke kolommen geven een raster van 4 × 4 met 16 deelgrafieken. corner=True behoudt alleen de onderste driehoek en vars=[...] beperkt de kolommen. De functie geeft een PairGrid terug.
sns.jointplot(data=days, x="temp_c", y="rentals") tekent een spreidingsdiagram met langs de randen het histogram van elke variabele; kind="hex" vervangt de punten door zeshoekige klassen, wat helpt bij grote datasets.
sns.relplot(..., kind="scatter") en sns.relplot(..., kind="line") zijn de versies van scatterplot en lineplot voor een volledige figuur; een spreidingsdiagram is het standaardtype. Gebruik ze als hetzelfde verband voor elke groep in een aparte deelgrafiek moet worden getoond.
sns.regplot(data=days, x="temp_c", y="rentals") toont dat de fietsverhuur stijgt van 180 bij 12 °C naar ongeveer 350 op de warmste dagen, met een correlatie van ongeveer 0,92. Op de dag met 30 °C zijn er minder verhuringen (340) dan op de dag met 27 °C (360), dus vlakken de punten bovenaan af; je kunt een aangepaste kwadratische kromme (order=2) vergelijken met de rechte lijn.
Belangrijkste punten
- Standaard middelen lijnen van seaborn herhaalde waarnemingen.
- Een betrouwbaarheidsband beschrijft de onzekerheid van een schatting.
- Gebruik het argument units en geen schatter (estimator) om afzonderlijke trajecten te behouden.
- Bekijk zowel de punten als de aangepaste lijnen.
- Matrices van spreidingsdiagrammen vergelijken variabelen en hun verdelingen.
3.3 Vergelijk groepen met grafieken voor categorische gegevens
De functies voor categorische gegevens van seaborn plaatsen elke categorie op posities 0, 1, 2, … op de categorische as. Zelfs getallen worden als labels behandeld: de jaren 2020, 2021 en 2023 worden op gelijke afstand getekend, zonder ruimte voor 2022. native_scale=True behoudt een numerieke as met de werkelijke afstanden.
sns.barplot(data=rain, x="station", y="rain_mm") tekent per station één staaf waarvan de hoogte het gemiddelde van de rijen is, met een foutbalk voor het 95%-betrouwbaarheidsinterval van dat gemiddelde. Bij de neerslagtabel zijn de staven Coast 86,25, North 51,25 en Valley 27,5 mm. estimator="median" of estimator="sum" verandert de samenvatting; errorbar="sd" of errorbar=None verandert of verwijdert de foutbalken.
sns.countplot(data=trips, x="mode") telt de rijen in elke categorie en heeft geen numerieke kolom nodig; sns.barplot vat een numerieke kolom samen. Gebruik countplot voor “hoeveel exemplaren” en barplot voor “hoeveel gemiddeld”.
sns.pointplot toont het gemiddelde van elke groep als een punt met een foutbalk en verbindt de punten van elke hue-groep met een lijn. Zo kun je veranderingen tussen categorieën eenvoudig vergelijken, bijvoorbeeld de gemiddelde neerslag van drie stations in elk van vier maanden.
Een staaf met een gemiddelde verbergt de spreiding en het aantal waarnemingen: een gemiddelde van 3 rijen ziet er even overtuigend uit als een gemiddelde van 300. De gegevens tonen is vaak beter: sns.stripplot tekent elke waarneming als een punt met een kleine willekeurige puntverschuiving en sns.swarmplot rangschikt de punten zo dat ze elkaar niet overlappen. Een puntenstrookdiagram kan over een boxplot of staafdiagram in hetzelfde grafiekgebied worden getekend.
Met hue plaatsen staafdiagrammen, boxplots en viooldiagrammen de groepen standaard naast elkaar binnen elke categorie. Punt-, puntenstrook- en zwermdiagrammen tekenen de groepen op dezelfde positie, tenzij dodge=True is ingesteld, zodat hun punten kunnen overlappen. Stel de categorievolgorde in met order=[...] en de groepsvolgorde met hue_order=[...].
De oriëntatie volgt uit de gegevens: zet de categorieën op de y-as en de getallen op de x-as, sns.barplot(data=rain, x="rain_mm", y="station"), voor horizontale staven met leesbare lange labels. orient="y" (of "h") geeft dit expliciet aan.
sns.catplot is de functie voor een volledige figuur voor alle grafieken voor categorische gegevens. De kind kan “strip” (de standaard), “swarm”, “box”, “violin”, “boxen”, “point”, “bar” of “count” zijn, en col of row verdeelt de grafiek in deelgrafieken.
Belangrijkste punten
- Frequentiestaafdiagrammen tellen rijen; staafdiagrammen vatten numerieke waarden samen.
- Puntenstrookdiagrammen en zwermdiagrammen tonen waarnemingen.
- Groepen naast elkaar plaatsen scheidt kleurgroepen binnen een categorie.
4Visualiseer verdelingen en waardenrasters
Een verdelingsgrafiek beschrijft een verzameling metingen, terwijl een hittekaart een tabel met kleuren beschrijft. Deze grafieken vatten veel waarden samen, dus hun instellingen beïnvloeden wat je kunt aflezen. Klassengrenzen bepalen welke waarnemingen samen worden geteld; kwartielen en snorren vatten verschillende delen van een steekproef samen; een kleurenschaal koppelt getallen aan kleurtinten. Doorloop die berekeningen voordat je de uiteindelijke afbeelding interpreteert.
4.1 Toon een verdeling met histogrammen en dichtheidskrommen
Een histogram verdeelt het bereik van een numerieke variabele in aangrenzende intervallen, klassen genoemd, en tekent boven elke klasse een staaf waarvan de hoogte het aantal waarnemingen in die klasse is. Het toont de vorm van een verdeling: waar waarden geconcentreerd zijn, hoe sterk ze zijn verspreid, of ze scheef verdeeld zijn en waar hiaten of ongebruikelijke waarden zitten.
counts, edges, patches = ax.hist(data, bins=5) tekent het histogram en geeft het aantal in elke klasse en de klassengrenzen terug. Bij een geheel getal hebben de klassen gelijke breedte van het minimum tot het maximum; de standaard is 10 klassen. Elke klasse bevat de linkergrens en sluit de rechtergrens uit, behalve de laatste klasse, die beide grenzen bevat.
20 reistijden voor woon-werkverkeer in minuten: 12, 15, 18, 20, 22, 22, 25, 27, 28, 30, 31, 33, 35, 38, 40, 42, 45, 50, 55, 62. Met bins=5 zijn de grenzen 12, 22, 32, 42, 52 en 62 en de aantallen 4, 7, 4, 3 en 2. De waarde 22 valt in de tweede klasse omdat klassen hun rechtergrens uitsluiten, en 62 telt mee in de laatste klasse omdat die klasse de grens wel bevat.
Het aantal en de positie van klassen veranderen het beeld. Dezelfde 20 tijden met grenzen [10, 20, 30, 40, 50, 60, 70] geven de aantallen 3, 6, 5, 3, 2 en 1. Te weinig klassen verbergen de vorm; te veel geven een grillige grafiek met veel bijna lege klassen. Probeer verschillende instellingen en kies bij voorkeur ronde klassengrenzen die lezers kunnen interpreteren, zoals stappen van 10 minuten.
density=True in Matplotlib, of stat="density" in seaborn, schaalt de staven zodat hun totale oppervlakte 1 is: elke hoogte is aantal ÷ (n × klassebreedte). Voor de gegevens over woon-werkverkeer met vijf klassen van 10 minuten is de hoogte van de tweede staaf 7 ÷ (20 × 10) = 0,035 per minuut. Een dichtheidshoogte is geen kans; hoogte × klassebreedte is het aandeel waarnemingen in de klasse.
sns.histplot(data=commutes, x="minutes") tekent een histogram met seaborn; bins en binwidth bepalen de klassen. stat kiest de hoogte: “count” (standaard), “probability” of “proportion” (hoogtes tellen op tot 1), “percent” (hoogtes tellen op tot 100) en “density” (oppervlakte 1). Voor de vijf klassen met reistijden geeft “probability” 0,2, 0,35, 0,2, 0,15 en 0,1.
Om groepen te vergelijken legt sns.histplot(data=commutes, x="minutes", hue="mode") per groep een histogram over de andere heen; multiple="stack" stapelt ze, multiple="dodge" zet ze naast elkaar en element="step" tekent omtreklijnen die bij overlap beter leesbaar zijn. Met stat="density", common_norm=False kun je groepen van verschillende grootte eerlijk vergelijken, doordat elke groep wordt geschaald naar een oppervlakte van 1.
Een kerndichtheidsschatting is een vloeiende kromme die de vorm van de verdeling schat; de oppervlakte eronder is 1. sns.kdeplot(data=commutes, x="minutes") tekent de kromme en sns.histplot(..., kde=True) voegt die toe aan een histogram. Een bw_adjust boven 1 maakt de kromme vloeiender, onder 1 gedetailleerder.
Een KDE-kromme loopt verder dan de kleinste en grootste waarden en kan dus dichtheid onder 0 minuten tonen voor tijden die niet negatief kunnen zijn. cut=0 stopt de kromme bij de grenzen van de gegevens. Bij kleine steekproeven kan de kromme een vorm suggereren die de gegevens niet ondersteunen.
In pandas tekent commutes["minutes"].plot.hist(bins=5, edgecolor="white") een histogram (standaard 10 klassen) en tekent df.hist() één histogram per numerieke kolom in een raster. In seaborn is sns.displot de versie voor een volledige figuur: kind="hist" (standaard), kind="kde" of kind="ecdf", waarbij een ECDF voor elke waarde het aandeel waarnemingen op of onder die waarde toont.
Belangrijkste punten
- De grenzen van een histogram bepalen in welke klasse een waarneming valt.
- Dichtheid gebruikt oppervlakte om een aandeel weer te geven.
- Een KDE vlakt een verdeling af en hangt af van de bandbreedte.
- Normaliseer groepen afzonderlijk om vormen te vergelijken.
4.2 Vat verdelingen samen en vergelijk ze met boxplots
Een boxplot vat een verdeling samen: de box loopt van het eerste kwartiel (Q1) tot het derde kwartiel (Q3), een lijn in de box markeert de mediaan, snorren lopen naar de kleinste en grootste gebruikelijke waarden en punten buiten de snorren worden afzonderlijk getekend als mogelijke uitschieters. De interkwartielafstand IQR = Q3 − Q1 is de lengte van de box en omvat de middelste helft van de gegevens.
Standaard gebruiken Matplotlib, pandas en seaborn whis=1.5: de uitschietergrenzen zijn Q1 − 1,5 × IQR en Q3 + 1,5 × IQR. Elke snor eindigt bij de meest extreme gegevenswaarde binnen de bijbehorende grens, niet bij de grens zelf, en elke waarde buiten de grenzen wordt als afzonderlijk punt getekend.
11 bezorgtijden in minuten: 14, 16, 17, 18, 19, 20, 21, 22, 24, 25, 41. Matplotlib berekent Q1 = 17,5, mediaan = 20 en Q3 = 23, dus IQR = 5,5. De grenzen zijn 17,5 − 8,25 = 9,25 en 23 + 8,25 = 31,25. De onderste snor eindigt bij 14, de bovenste bij 25 en 41 wordt als uitschieterpunt getekend.
Kwartielen hangen af van de methode. De grafiekbibliotheken gebruiken lineaire interpolatie tussen gesorteerde waarden (de standaard in NumPy en pandas), wat hierboven 17,5 en 23 geeft. De handmatige methode waarbij je de medianen van de onderste en bovenste helft neemt zonder de algemene mediaan, geeft voor dezelfde gegevens Q1 = 17 en Q3 = 24. Beide zijn geldig; hierdoor ontstaan kleine verschillen tussen een handberekening en een grafiek.
Teken de samenvatting met de bibliotheek die je gebruikt: ax.boxplot([north, coast], tick_labels=["North", "Coast"]) in Matplotlib (vóór versie 3.9 heette het argument labels); rain.boxplot(column="rain_mm", by="station") in pandas, dat ook de overkoepelende titel “Boxplot grouped by station” toevoegt; sns.boxplot(data=rain, x="station", y="rain_mm") in seaborn, met hue voor een tweede groepering. whis=(0, 100) tekent de snorren tot het minimum en maximum en showfliers=False verbergt de uitschieterpunten.
Met boxplots naast elkaar vergelijk je groepen in één oogopslag: vergelijk de medianen, de lengtes van de boxen (de spreiding van de middelste helft) en de overlap van de boxen. Een mediaan dicht bij één uiteinde van de box, of een snor die veel langer is dan de andere, wijst op een scheve verdeling.
Een boxplot toont alleen vijf getallen en de uitschieters. De grafiek toont niet het aantal waarnemingen en heel verschillende vormen kunnen dezelfde box opleveren: een verdeling met twee afzonderlijke pieken en een verdeling met één piek kunnen dezelfde Q1, mediaan en Q3 hebben. Door de punten eroverheen te tekenen, sns.stripplot(data=rain, x="station", y="rain_mm", color="black", alpha=0.5), of een viooldiagram te gebruiken, maak je dit zichtbaar.
sns.violinplot(data=rain, x="station", y="rain_mm") tekent voor elke groep een gespiegelde dichtheidskromme met daarin een kleine boxplot (inner="box", de standaard); inner="quart" markeert in plaats daarvan de kwartielen met lijnen. Bij een hue met twee niveaus zet split=True aan elke kant van de viool één groep. Net als een KDE kan de viool buiten de gegevens doorlopen; cut=0 stopt de viool bij het waargenomen minimum en maximum.
Een punt dat door de 1,5 × IQR-regel wordt gemarkeerd, is ongebruikelijk ten opzichte van de rest van de gegevens, een reden om de waarde te onderzoeken. Controleer het: het kan een invoerfout zijn of een echte, belangrijke waarde, zoals een bezorging die door een wegafsluiting vertraging had. Als je punten alleen verwijdert omdat de grafiek ze markeert, vertekent dat de analyse.
Belangrijkste punten
- De lengte van de box is de IQR.
- Snorren eindigen bij waarnemingen binnen de uitschietergrenzen.
- Kwartielmethoden kunnen verschillen.
- Verborgen uitschieters blijven in de onderliggende gegevens staan.
- Punten en viooldiagrammen tonen informatie die een box verbergt.
4.3 Geef een waardenraster weer als hittekaart
Een hittekaart toont een tabel met getallen als een raster van gekleurde cellen: rijen en kolommen zijn twee categorieën (of in klassen ingedeelde variabelen) en de kleur van elke cel staat voor de waarde. Een hittekaart past bij patronen in tweedimensionale tabellen, zoals bezoekers per dag en dagdeel, en bij correlatiematrices.
sns.heatmap(table) neemt een brede tabel, gebruikt de index als rijlabels en de kolommen als kolomlabels en voegt een kleurenbalk als legenda toe. De tabel komt meestal uit pivot_table: visits.pivot_table(index="day", columns="slot", values="visitors", aggfunc="mean").
Een museum telt bezoekers per dagdeel. Zaterdagochtend 120 en 140, zaterdagmiddag 200; zondagochtend 90, zondagmiddag 160; maandagochtend 40, maandagmiddag 70 en 90. De draaitabel met gemiddelden bevat Mon 40 en 80, Sat 130 en 200, Sun 90 en 160 (ochtend en middag). sns.heatmap(pt, annot=True, fmt=".0f", cmap="Blues") toont de drukste cel, zaterdagmiddag, als de donkerste. De draaitabel sorteert de dagen alfabetisch (Mon, Sat, Sun); met pt.reindex(["Sat", "Sun", "Mon"]) herstel je een gekozen volgorde.
annot=True schrijft elke waarde in de cel en fmt stelt de getalnotatie in. De standaard ".2g" behoudt twee significante cijfers, dus 43,25 wordt weergegeven als “43” en 1.234 als “1.2e+03”. Gebruik fmt=".0f" voor gehele getallen of fmt=".2f" voor twee decimalen; fmt="d" werkt alleen voor gegevens met een geheelgetaltype en geeft een ValueError bij drijvendekommagetallen.
Een correlatiehittekaart begint met corr = df.corr(numeric_only=True), een vierkante, symmetrische tabel waarvan de gedefinieerde coëfficiënten van −1 tot 1 lopen. Niet-constante numerieke kolommen hebben 1 op de diagonaal; constante kolommen hebben ongedefinieerde correlaties. In pandas 2 en later is de standaard voor numeric_only False, dus df.corr() geeft een fout als de tabel een tekstkolom heeft. Teken de hittekaart met sns.heatmap(corr, annot=True, fmt=".2f", cmap="vlag", vmin=-1, vmax=1, center=0).
Acht dagen met temperatuur (°C), fietsverhuur, neerslag (mm) en wind (km/h). De correlatiematrix geeft voor temperatuur en fietsverhuur 0,92, voor fietsverhuur en neerslag −0,82, voor neerslag en wind 0,75 en voor temperatuur en wind −0,38. Met de kleurenschaal “vlag” wordt het sterk positieve paar dieprood, het sterk negatieve paar diepblauw en het zwakke paar temperatuur en wind een bleke tint dicht bij het witte midden.
Zonder vmin en vmax lopen de kleuren van de kleinste tot de grootste waarde in die tabel, zodat dezelfde kleur in twee hittekaarten verschillende waarden kan betekenen. Leg de grenzen vast om hittekaarten te vergelijken en gebruik vmin=-1, vmax=1 voor correlaties. Een sequentiële kleurenschaal zoals “rocket” (de standaard van seaborn), “viridis” of “Blues” past bij waarden die van laag naar hoog lopen; een divergerende kleurenschaal zoals “vlag”, “coolwarm” of “RdBu_r”, met center op het betekenisvolle midden, past bij waarden boven en onder een referentiewaarde zoals 0. Als center is ingesteld en cmap niet, gebruikt seaborn de divergerende schaal “icefire”.
Handige opties: linewidths=0.5 tekent dunne lijnen tussen cellen, square=True maakt de cellen vierkant, cbar_kws={"label": "Visitors"} geeft de kleurenbalk een label en ontbrekende waarden (NaN) blijven leeg. mask=np.triu(np.ones_like(corr, dtype=bool)) verbergt de bovenste driehoek en de diagonaal van een correlatiematrix, die de onderste driehoek herhalen.
In Matplotlib tekent im = ax.imshow(values, cmap="viridis"); fig.colorbar(im, ax=ax) een hittekaart van een 2-dimensionale array, met rij 0 bovenaan; “viridis” is de standaardkleurenschaal van Matplotlib. imshow voorziet de assen van rij- en kolomnummers, dus stel namen zelf in: ax.set_xticks(range(len(cols)), labels=cols). ax.pcolormesh is een alternatief als cellen ongelijke afmetingen hebben.
Een correlatiecoëfficiënt meet alleen de sterkte van een lineaire samenhang. Een correlatie dicht bij 0 sluit een sterk kromlijnig verband niet uit en één uitschieter kan een coëfficiënt sterk verhogen of verlagen. Bekijk de bijbehorende spreidingsdiagrammen, bijvoorbeeld met een matrix van spreidingsdiagrammen, voordat je een correlatiehittekaart interpreteert.
Belangrijkste punten
- Kleuren in een hittekaart geven tabelwaarden weer.
- Leg de grenzen van de kleurenschaal vast om grafieken te vergelijken.
- Correlatieschalen lopen van −1 tot 1.
- Bekijk spreidingsdiagrammen voordat je correlaties interpreteert.
5Maak figuren met meerdere deelgrafieken, voeg annotaties toe en exporteer ze
Een bruikbare figuur heeft vaak meerdere weergaven van dezelfde gegevens nodig. Met deelgrafieken kun je groepen vergelijken, annotaties verbinden een bewering met een specifieke waarde en exportinstellingen zetten het resultaat om in een afbeelding die bij de bestemming past. Houd tijdens dit proces de controle over de figuur. Het object dat je grafieken bevat, bevat ook hun totale grootte en is de betrouwbaarste manier om precies het resultaat op te slaan dat je hebt gemaakt.
5.1 Rangschik meerdere grafieken in één figuur
Herhaalde deelgrafieken zijn een reeks grafieken van hetzelfde type, één voor elke deelverzameling van de gegevens, getekend met dezelfde schalen en naast elkaar geplaatst zodat je de deelverzamelingen kunt vergelijken. In Matplotlib maak je ze als een raster van grafiekgebieden in één figuur.
fig, axes = plt.subplots(2, 3, figsize=(12, 6)) geeft een figuur en een NumPy-array van 2 × 3 grafiekgebieden terug. axes[0, 0] is de deelgrafiek linksboven en axes[1, 2] die rechtsonder. Met één rij of één kolom is de array eendimensionaal, dus plt.subplots(1, 3) geeft axes[0], axes[1] en axes[2]. axes.flat doorloopt alle deelgrafieken rij voor rij.
De array zelf kan niet tekenen: axes.plot(...) geeft AttributeError: 'numpy.ndarray' object has no attribute 'plot'. Selecteer eerst één deelgrafiek met een index, zoals in axes[0, 1].plot(...).
sharex=True en sharey=True geven alle deelgrafieken dezelfde x- of y-grenzen, zodat gelijke hoogtes in elke deelgrafiek gelijke waarden betekenen en alleen de buitenste deelgrafieken labels bij de maatstreepjes tonen. Zonder gedeelde assen schaalt elke deelgrafiek naar de eigen gegevens en kan een klein bereik even groot lijken als een groot bereik.
fig, axes = plt.subplots(2, 2, sharey=True, layout="constrained"), daarna for ax, (name, grp) in zip(axes.flat, rain.groupby("station")): ax.plot(grp["month_num"], grp["rain_mm"], marker="o"); ax.set_title(name). De drie stations vullen drie van de vier deelgrafieken; axes[1, 1].axis("off") verbergt de lege vierde.
Labels van aangrenzende deelgrafieken kunnen overlappen. layout="constrained" in plt.subplots of plt.figure past de tussenruimte automatisch aan; fig.tight_layout(), aangeroepen na het tekenen, is het oudere alternatief. fig.suptitle("Monthly rainfall by station") voegt één titel voor de hele figuur toe en fig.supxlabel(...) en fig.supylabel(...) voegen gedeelde aslabels toe.
Deelgrafieken van verschillende grootte: plt.subplots(1, 2, gridspec_kw={"width_ratios": [2, 1]}) maakt de linkerdeelgrafiek twee keer zo breed als de rechter. fig, axd = plt.subplot_mosaic([["top", "top"], ["left", "right"]]) geeft een dictionary van grafiekgebieden terug, hier een brede deelgrafiek axd["top"] boven twee kleinere.
Grafieken van pandas en functies van seaborn voor één grafiekgebied kunnen gekozen deelgrafieken vullen met ax=: wide["North"].plot(ax=axes[0, 0]) of sns.histplot(data=commutes, x="minutes", ax=axes[0, 1]). Zo combineer je grafieken uit alle drie de bibliotheken in één figuur.
Belangrijkste punten
- Selecteer met een index een grafiekgebied uit de array voordat je tekent.
- Gedeelde schalen maken vergelijking tussen deelgrafieken mogelijk.
- Automatische figuurindeling maakt ruimte voor labels.
5.2 Verdeel gegevens met seaborn over deelgrafieken per groep
Verdelen in deelgrafieken per groep tekent dezelfde grafiek eenmaal voor elk niveau van een categorische variabele, elk in een eigen deelgrafiek, met gedeelde assen. Functies van seaborn voor een volledige figuur doen dit met col= (deelgrafieken naast elkaar), row= (deelgrafieken onder elkaar) en col_wrap= (begin na dat aantal kolommen een nieuwe rij).
sns.relplot(data=rain, x="month_num", y="rain_mm", col="station", col_wrap=2, kind="line", height=3, aspect=1.5) tekent drie deelgrafieken, twee in de eerste rij en één in de tweede. Elke deelgrafiek is 3 inch hoog en 3 × 1,5 = 4,5 inch breed, dus de figuur is ongeveer 9 × 6 inch.
row en col samen maken een raster met één deelgrafiek per combinatie van niveaus: twee seizoenen als rijen en drie stations als kolommen geven 2 × 3 = 6 deelgrafieken. col_wrap kan niet worden gecombineerd met row.
Dezelfde argumenten werken voor elk type grafiek: sns.displot(data=commutes, x="minutes", col="mode") geeft één histogram per vervoerswijze en sns.catplot(data=rain, x="station", y="rain_mm", col="season", kind="box") geeft boxplots per seizoen.
Deelgrafieken delen standaard hun x- en y-as, zodat je hoogtes tussen deelgrafieken kunt vergelijken. Als je elke deelgrafiek naar de eigen gegevens laat schalen, zie je details binnen kleine groepen, maar worden vergelijkingen tussen deelgrafieken op het eerste gezicht misleidend. Geef bij relplot en displot facet_kws={"sharey": False} door; catplot accepteert sharey=False rechtstreeks en als je het ook in facet_kws doorgeeft, ontstaat een TypeError.
sns.FacetGrid maakt het raster rechtstreeks en tekent daarna in elke deelgrafiek: g = sns.FacetGrid(commutes, col="mode", height=3); g.map_dataframe(sns.histplot, x="minutes"); g.add_legend(). g.map(plt.scatter, "temp_c", "rentals") geeft de genoemde kolommen als positionele argumenten door aan een grafiekfunctie.
Pas het raster aan met de methoden ervan: g.set_titles("{col_name}") stelt titels voor deelgrafieken in op basis van de niveaunamen, g.set_axis_labels("Month", "Rainfall (mm)") geeft alle assen labels en g.set(ylim=(0, 120)) past een instelling voor grafiekgebieden toe op elke deelgrafiek. Met g.axes_dict["Coast"] of g.axes.flat bereik je afzonderlijke grafiekgebieden en g.figure.suptitle("Rainfall by station", y=1.02) voegt een overkoepelende titel boven de deelgrafieken toe.
hue en col verdelen beide op basis van een variabele. hue legt de groepen over elkaar in één grafiekgebied, waardoor je een paar groepen eenvoudig rechtstreeks kunt vergelijken; col scheidt ze, wat leesbaar blijft als lijnen of punten zouden overlappen of als er veel groepen zijn. Je kunt beide tegelijk gebruiken, bijvoorbeeld col="station", hue="season".
Functies voor een volledige figuur tekenen niet in een bestaand grafiekgebied (relplot, displot en catplot negeren ax= met een waarschuwing, lmplot wijst het af) en accepteren niet het Matplotlib-argument figsize (doorgeven geeft een fout): stel de grootte van het raster in met height en aspect. Om een grafiek met deelgrafieken per groep naast andere grafieken in één Matplotlib-figuur te plaatsen, maak je de deelgrafieken met plt.subplots en functies voor één grafiekgebied.
Belangrijkste punten
- Deelgrafieken per groep verdelen rijen over grafiekgebieden op basis van hun groep.
- De afmetingen van deelgrafieken gebruiken hoogte en breedte-hoogteverhouding.
- Rastermethoden passen de hele weergave aan.
- Grafieken van functies voor een volledige figuur kunnen geen bestaand grafiekgebied vullen.
5.3 Voeg annotaties en referentielijnen toe
ax.text(x, y, "text") schrijft tekst op een punt in gegevenscoördinaten, dezelfde eenheden als die van de getekende waarden. ha (“left”, “center”, “right”) en va (“top”, “center”, “bottom”) lijnen de tekst uit ten opzichte van dat punt; fontsize en color bepalen de stijl.
Met transform=ax.transAxes zijn posities in plaats daarvan fracties van het grafiekgebied: (0, 0) is de linkerbenedenhoek en (1, 1) de rechterbovenhoek. ax.text(0.02, 0.95, "n = 20", transform=ax.transAxes, va="top") houdt een notitie in de linkerbovenhoek, ongeacht de gegevens en grenzen. Tekst in gegevenscoördinaten verschuift als de grenzen veranderen en kan buiten het grafiekgebied terechtkomen.
ax.annotate("Wettest month", xy=(1, 110), xytext=(2, 115), arrowprops=dict(arrowstyle="->")) schrijft de tekst bij xytext en tekent een pijl naar het punt xy; beide zijn standaard in gegevenscoördinaten. Met textcoords="offset points" wordt xytext een verschuiving vanaf xy in punten, bijvoorbeeld xytext=(10, 10) voor 10 punten naar rechts en omhoog.
Referentielijnen lopen over het hele grafiekgebied: ax.axhline(50, color="gray", linestyle="--", label="Target") tekent een horizontale lijn bij y = 50 en ax.axvline(...) een verticale. ax.axvspan(6, 8, alpha=0.2) arceert het bereik van x = 6 tot x = 8, bijvoorbeeld een vakantieperiode. ax.hlines(y, xmin, xmax) tekent horizontale lijnen over een beperkt bereik.
In het histogram van de 20 reistijden voor woon-werkverkeer is het gemiddelde 650 ÷ 20 = 32,5 minuten en de mediaan 30,5 minuten. ax.axvline(32.5, color="black", linestyle="--"); ax.text(33.5, 6.5, "mean 32.5 min") markeert het gemiddelde, dat rechts van de mediaan ligt omdat enkele lange reistijden het omhoogtrekken.
Staafwaarden: ax.bar_label(bars, fmt="%.0f") voorziet de door ax.bar teruggegeven staven van labels. Bij staven die door pandas of seaborn zijn getekend, worden de staven opgeslagen in ax.containers, dus ax.bar_label(ax.containers[0]) voorziet de eerste reeks van labels. padding=3 plaatst de labels 3 punten van de uiteinden van de staven.
Vormen komen uit matplotlib.patches: ax.add_patch(Rectangle((x, y), width, height, fill=False, edgecolor="red")) omlijnt een gebied in gegevenscoördinaten en Circle en Polygon werken op dezelfde manier.
Met f-strings kun je tekst uit de gegevens berekenen, zodat labels correct blijven als de gegevens veranderen: ax.text(..., f"mean {commutes['minutes'].mean():.1f} min"). Annotaties worden boven op de gegevens getekend; plaats ze in lege gebieden en houd het aantal beperkt, zodat ze aanwijzen wat belangrijk is.
Belangrijkste punten
- Gegevenscoördinaten verankeren tekst aan metingen.
- Relatieve grafiekgebiedcoördinaten verankeren tekst aan de deelgrafiek.
- Een annotatie onderscheidt het doelpunt van de tekstpositie.
- Bereken veranderende labels uit de gegevens.
5.4 Sla figuren op voor rapporten en het web
fig.savefig("rainfall.png") slaat de figuur op; de bestandsextensie bepaalt het formaat: PNG en JPEG zijn rasterafbeeldingen die uit pixels bestaan, terwijl SVG en PDF vectorafbeeldingen zijn die uit vormen bestaan. format="pdf" stelt het formaat expliciet in.
Rasterafbeeldingen hebben een vast aantal pixels en worden wazig bij vergroting; vectorbestanden blijven op elke grootte scherp en zijn geschikt voor rapporten, drukwerk en documenten. PNG is een goed rasterformaat voor grafieken op het web en in presentaties. JPEG-compressie verliest informatie en maakt dunne lijnen en tekst wazig, dus is een slechte keuze voor grafieken.
Pixelafmetingen = figuurafmetingen in inches × dpi (punten per inch). fig, ax = plt.subplots(figsize=(8, 5)) opgeslagen met dpi=150 geeft 8 × 150 bij 5 × 150 = 1.200 × 750 pixels. Zonder dpi gebruikt savefig de eigen dpi van de figuur, standaard 100, zodat dezelfde figuur 800 × 500 pixels wordt. Voor vectorformaten beïnvloedt dpi alleen ingesloten rasteronderdelen.
Tekstgroottes en lijnbreedtes worden ingesteld in punten (1 punt = 1/72 inch), ten opzichte van de figuurafmetingen in inches. Als je dpi verhoogt, voeg je pixels toe zonder te veranderen hoe groot de tekst ten opzichte van de grafiek lijkt; als je in plaats daarvan figsize vergroot, wordt de tekst relatief kleiner. Kies figsize voor de uiteindelijke weergavegrootte en dpi voor de scherpte.
bbox_inches="tight" snijdt lege marges weg en neemt elementen mee die buiten de figuur uitsteken, zoals een legenda buiten het grafiekgebied; de opgeslagen afbeelding is dan iets kleiner of groter dan figuurafmetingen × dpi. pad_inches=0.1 stelt de marge in die eromheen behouden blijft.
transparent=True slaat zonder achtergrond op, wat past bij presentaties met een gekleurde achtergrond; facecolor="white" dwingt een witte achtergrond af, wat van belang is als anders een donker notebookthema in het bestand terecht zou komen.
plt.savefig slaat de huidige figuur op, dus roep dit aan vóór een blokkerende plt.show(): zodra het venster is gesloten, houdt pyplot die figuur niet meer bij en slaat een latere plt.savefig(...) een nieuwe, lege figuur op. In een Jupyter-notebook laat pyplot de figuur ook aan het eind van de cel los, zodat plt.savefig in een latere cel een lege afbeelding opslaat. Door de figuur in een variabele te bewaren voorkom je beide problemen: fig.savefig(...) werkt nog na plt.show() of in een latere notebookcel.
Resultaten van seaborn sla je op dezelfde manier op: een grafiek van een functie voor één grafiekgebied via de bijbehorende figuur, ax.figure.savefig("box.png", dpi=200), en een raster van een functie voor een volledige figuur met g.savefig("facets.png", dpi=200), dat standaard nauwsluitende begrenzingskaders gebruikt.
for name, grp in rain.groupby("station"):
grp = grp.sort_values("month_num")
fig, ax = plt.subplots(figsize=(6, 4))
ax.plot(grp["month_num"], grp["rain_mm"], marker="o")
ax.set(title=name, xlabel="Month", ylabel="Rainfall (mm)")
fig.savefig(f"rain_{name}.png", dpi=150, bbox_inches="tight")
plt.close(fig)
. Door elke figuur te sluiten houd je het geheugengebruik laag en voorkom je de waarschuwing over meer dan 20 open figuren.
Belangrijkste punten
- Sla het figuurobject op dat je hebt gemaakt.
- Inches maal dpi geeft de afmetingen van een onbesneden rasterafbeelding.
- Nauwsluitende begrenzingskaders veranderen de grens van de geëxporteerde afbeelding.
- Vectoruitvoer behoudt vormen.
- Sluit elke figuur na export in een reeks.
Matplotlib en Seaborn: voorbeelden
1Maak grafieken met figuren en grafiekgebieden van Matplotlib
15 stappen
- 1IntroductieMaak één grafiek tegelijk
Een grafiekopdracht heeft een plek nodig om te tekenen. Matplotlib maakt die plek expliciet: een figuur bevat een of meer grafiekgebieden en elk gebied bevat de getekende elementen en labels. Begin met één gebied en gebruik daarna dezelfde objecten om lijnen, punten, staven en nuttige instellingen toe te voegen. Als je de figuur en elk grafiekgebied een naam geeft, kun je gemakkelijker de juiste grafiek aanpassen wanneer een notebook groeit of een figuur meerdere deelgrafieken bevat.
- 2UitlegHoud het canvas vast
Een figuur bevat de volledige afbeelding. Een grafiekgebied bevat één grafiek en de coördinaatassen ervan. Maak beide expliciet aan, zodat latere opdrachten een duidelijke bestemming hebben.
import matplotlib.pyplot as plt fig, ax = plt.subplots(figsize=(7, 4))De breedte en hoogte zijn in inches. De variabele
axverwijst naar het grafiekgebied binnenfig; dit object krijgt de lijn en de bijbehorende labels. - 3VoorbeeldTeken in dat gebied
Voeg een korte temperatuurreeks toe aan het grafiekgebied dat je zojuist hebt gemaakt. Elk paar wordt een punt op de lijn.
ax.plot([1, 2, 3], [8, 11, 10]) ax.set(title="Daily temperature", xlabel="Day", ylabel="Temperature (°C)")Als je
ax.plotopnieuw aanroept, voeg je nog een lijn toe aan hetzelfde gebied. In een script toontplt.show()de figuur; een notebook toont die normaal onder de cel. - 4UitdagingHerstel een titeloproep
De aanroep
ax.title("Daily temperature")geeft een foutmelding “Text object is not callable”. Hoe moet je die aanroep veranderen?---reveal---
Gebruik
ax.set_title("Daily temperature"). Het attribuuttitlevan het grafiekgebied is al een tekstobject;set_titleis de methode die het verandert. Het pyplot-equivalent isplt.title(...), maar dat werkt op het grafiekgebied dat op dat moment actief is. - 5UitlegHoud de waarnemingen gepaard
Een lijn verbindt punten in de invoervolgorde. Als de afstandskolom 4, 1, 3 km bevat, loopt de lijn eerst terug en daarna vooruit. Sorteer volledige waarnemingen op afstand en houd elke hoogte naast de oorspronkelijke afstand.
route = route.sort_values("distance_km") ax.plot(route["distance_km"], route["elevation_m"])Een spreidingsdiagram heeft geen verbindingsvolgorde nodig, omdat elke markering een afzonderlijke waarneming is.
- 6VoorbeeldGeef elke reeks een legenda-item
Ook lijnstijlen en markeringsstijlen kunnen reeksen herkenbaar maken, net als kleur. Voeg bij het tekenen een label toe en laat het grafiekgebied daarna een legenda maken.
ax.plot([1, 2, 3], [4, 8, 7], "o--", label="East") ax.plot([1, 2, 3], [6, 7, 9], "s-", label="West") ax.legend(title="Site")Bij een spreidingsdiagram hebben numerieke
c-waarden een kleurenbalk nodig om hun kleurverloop uit te leggen. Verlaagalphaals overlappende punten de steekproef aan het zicht onttrekken. - 7UitdagingVoorspel een grootteverandering
Een markering in een spreidingsdiagram gebruikt
s=25. Je verandert dit ins=100met dezelfde markeringsvorm. Hoe verandert de breedte?---reveal---
De breedte verdubbelt. De oppervlakte is met een factor vier gegroeid en lineaire afmetingen groeien met de vierkantswortel van die factor. Bij een spreidingsdiagram wordt
sgemeten in kwadraatpunten; als je dit als een breedte leest, voorspel je ten onrechte een verviervoudiging. - 8UitlegPlaats categorieën en waarden
Staven gebruiken afzonderlijke categorieposities. Begin met één getal per categorie; tekenreeksen worden labels op gelijke afstand in de opgegeven volgorde. Een horizontale grafiek geeft lange namen de ruimte.
fig, ax = plt.subplots() bars = ax.barh(["Bus", "Rail", "Walk"], [48, 37, 25]) ax.invert_yaxis() ax.bar_label(bars)Door de as om te keren komt de eerste categorie bovenaan. Als je alleen de namen omkeert, koppel je de waarden aan de verkeerde categorieën.
- 9VoorbeeldBouw een stapel vanaf de basis op
Stel dat ritten op een werkdag bestaan uit 32 busritten en 18 treinritten. Het tweede staafsegment moet boven op het eerste beginnen.
ax.bar(["Weekday"], [32], label="Bus") ax.bar(["Weekday"], [18], bottom=[32], label="Rail") ax.legend()Het treinsegment heeft hoogte 18 en eindigt bij 50. Als een derde vervoerswijze wordt toegevoegd, is de basislijn daarvan het cumulatieve totaal van de twee al getekende segmenten.
- 10UitdagingBepaal de plaats van gegroepeerde staven
Twee staven hebben elk breedte 0,4 en moeten samen worden gecentreerd op categoriepositie 1. Waar moeten hun middelpunten liggen?
---reveal---
Gebruik 0,8 en 1,2, een halve breedte aan weerszijden van het maatstreepje. Hun binnenranden raken elkaar bij 1 en het paar is gecentreerd op de categorie. Met posities 1 en 1,4 krijg je ook een paar naast elkaar, maar verschuift het gezamenlijke middelpunt weg van het maatstreepje van de categorie.
- 11UitlegOnderscheid posities van labels
Maatstreepjes markeren coördinaatposities; hun labels zijn de tekst die daar wordt getoond. Geef beide samen op als je numerieke maandposities vervangt door namen.
ax.set_xticks([1, 2, 3], labels=["Jan", "Feb", "Mar"]) ax.set_ylabel("Rainfall (mm)") ax.grid(axis="y", alpha=0.3)Een opmaakfunctie verandert hoe bestaande getallen worden weergegeven. De functie schaalt de gegevens niet opnieuw, dus controleer of percentages zijn opgeslagen als fracties of als getallen van 0 tot 100.
- 12VoorbeeldKies een betekenisvolle schaal
Gelijke stappen op een lineaire schaal betekenen gelijke verschillen. Gelijke stappen op een logaritmische schaal betekenen gelijke verhoudingen.
ax.set_yscale("log")De waarden 5, 50 en 500 staan op gelijke afstand omdat elke waarde tien keer de vorige is. Nul en negatieve waarden kunnen niet op een gewone logaritmische schaal verschijnen. Stijlen bepalen afzonderlijk het uiterlijk: gebruik een stijlcontext als een ander uiterlijk alleen op één codeblok van toepassing moet zijn.
- 13UitdagingGeef de bedoelde deelgrafiek een label
Een figuur met twee deelgrafieken heeft een titel nodig op de eerste, maar
plt.title(...)verandert de tweede. Hoe kan de code zich betrouwbaar op de eerste deelgrafiek richten?---reveal---
Roep
axes[0].set_title(...)aan. Het genoemde grafiekgebied is expliciet, zodat de huidige pyplot-toestand de bestemming niet meer bepaalt. Dit is van belang wanneer een figuur meerdere deelgrafieken heeft of een hulpfunctie een ander grafiekgebied maakt of selecteert. - 14UitdagingLeg een numerieke kleurenschaal uit
Een spreidingsdiagram gebruikt puntkleur voor neerslag en markeringsoppervlakte voor het aantal verhuringen. De legenda noemt stations, maar geeft geen numerieke kleurenschaal. Wat heeft de figuur nog nodig?
---reveal---
Voeg een kleurenbalk toe die aan het resultaat van het spreidingsdiagram is gekoppeld en geef die het label “Neerslag (mm)”. De stationslegenda legt de groepen uit, terwijl de kleurenbalk de numerieke kleurtinten verklaart. Als je het teruggegeven spreidingsobject bewaart, kan
fig.colorbardezelfde koppeling gebruiken als de getekende punten. - 15SamenvattingControleer het resultaat dat je hebt gemaakt
Een grafiek heeft een canvas, een grafiekgebied en grafische objecten die aan dat gebied zijn gekoppeld. Controleer of elke reeks de bedoelde waarnemingsparen behoudt, of de labels variabelen en eenheden aangeven en of numerieke kleurkoppelingen een legenda hebben. Als een verandering de verkeerde plek beïnvloedt, controleer dan welk grafiekgebied de methodeaanroep heeft ontvangen. Als een vorm er verkeerd uitziet, controleer dan de volgorde en coördinaten van de gegevens voordat je de stijl verandert.
2Maak grafieken rechtstreeks vanuit pandas
9 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieLaat de tabel de grafiek voeden
- 2UitlegGebruik de labels van de tabel
- 3VoorbeeldKies numerieke kolommen
- 4UitdagingLijn lijnen en staven uit
- 5UitlegVat samen voordat je tekent
- 6VoorbeeldKies een structuur voor de volgende bibliotheek
- 7UitdagingHerstel een herhaald paar bij pivoteren
- 8UitdagingVat samen en herstructureer
- 9SamenvattingControleer het resultaat dat je hebt gemaakt
3Maak statistische grafieken met seaborn
12 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieLees wat de functie berekent
- 2UitlegKoppel variabelen aan kenmerken
- 3VoorbeeldKies wie de indeling beheert
- 4UitdagingStem de functie af op de indeling
- 5UitlegLees de schatter van de lijn
- 6VoorbeeldBehoud elk traject
- 7UitdagingInterpreteer een smalle band
- 8UitlegTel rijen of vat waarden samen
- 9VoorbeeldToon de waarnemingen
- 10UitdagingKies de samenvatting
- 11UitdagingVerklaar de veranderende staven
- 12SamenvattingControleer het resultaat dat je hebt gemaakt
4Visualiseer verdelingen en waardenrasters
12 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieLees samengevatte gegevens zorgvuldig
- 2UitlegTel een klasse correct
- 3VoorbeeldZet een aantal om in dichtheid
- 4UitdagingVergelijk klassen met ongelijke breedte
- 5UitlegBepaal de uitschietergrenzen vanuit de box
- 6VoorbeeldBepaal het waargenomen uiteinde van de snor
- 7UitdagingKijk achter een identieke box
- 8UitlegBegin met het numerieke raster
- 9VoorbeeldLeg de betekenis van kleuren vast
- 10UitdagingOnderzoek overeenkomende kleurtinten
- 11UitdagingBekijk twee samenvattingen samen
- 12SamenvattingControleer het resultaat dat je hebt gemaakt
5Maak figuren met meerdere deelgrafieken, voeg annotaties toe en exporteer ze
16 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieBereid een figuur voor om te delen
- 2UitlegMaak afzonderlijk aanspreekbare deelgrafieken
- 3VoorbeeldVul het raster met groepen
- 4UitdagingVergelijk schalen eerlijk
- 5UitlegLaat seaborn de tabel verdelen
- 6VoorbeeldPas het raster als geheel aan
- 7UitdagingWijzig het delen met het juiste argument
- 8UitlegKies waaraan je de tekst verankert
- 9VoorbeeldKoppel een label aan een piek
- 10UitdagingHoud een label na filteren correct
- 11UitlegKies afmetingen vóór pixels
- 12VoorbeeldSla de bewaarde figuur op
- 13UitdagingCombineer keuzes voor indeling en export
- 14UitdagingRond een reproduceerbare reeks exports af
- 15TipControleer het opgeslagen resultaat
- 16SamenvattingControleer het resultaat dat je hebt gemaakt
Matplotlib en Seaborn: oefenvragen
Set 1: Pas grafiekkeuzes toe op nieuwe gegevens10 Oefenvragen
Vraag 1 van 10
Toon antwoordVerberg antwoord
Vraag 2 van 10
ax.scatter(x, y, s=64)?Toon antwoordVerberg antwoord
s van een spreidingsdiagram bepaalt de markeringsoppervlakte in kwadraatpunten. Het is geen breedte of straal: als de oppervlakte met een factor vier verandert, veranderen de lineaire afmetingen van een markering met een factor twee, bij dezelfde markeringsvorm.Vraag 3 van 10
[0, 5, 10, 15]?Toon antwoordVerberg antwoord
Vraag 4 van 10
Toon antwoordVerberg antwoord
Vraag 5 van 10
Toon antwoordVerberg antwoord
xmax=1 geeft die coördinaat dan het label 75%. Als je de lijn bij 75 plaatst, verandert de numerieke positie; opmaak kan dat verschil in coördinaten niet corrigeren.Vraag 6 van 10
[4, 1, 3] km en bijbehorende hoogtes [90, 40, 75] m. Welke volgorde moet een vooruitlopende lijn gebruiken?Toon antwoordVerberg antwoord
Vraag 7 van 10
Toon antwoordVerberg antwoord
Vraag 8 van 10
Toon antwoordVerberg antwoord
Vraag 9 van 10
Toon antwoordVerberg antwoord
Vraag 10 van 10
Toon antwoordVerberg antwoord
Set 2: Lees grafieken en controleer de basis10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
df.plot(y="depth_mm") met Matplotlib als standaardbibliotheek terug wanneer het één deelgrafiek tekent?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
plt.subplots(2, 3) de deelgrafiek rechtsonder?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 3: Verbind tabellen, samenvattingen en grafieken10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
ax.plot(...) met een bestaand grafiekgebied?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
fig in één cel en bewaart die. Een latere cel moet precies die grafiek opslaan nadat pyplot die heeft losgelaten. Welke aanroep is betrouwbaar?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
plt.title("Depth") aan nadat die een tweede figuur heeft gemaakt. De titel moet bij het grafiekgebied van de eerste figuur horen, opgeslagen als first_ax. Hoe moet je de titel instellen?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
xy en xytext zijn bij textcoords="offset points"?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 4: Onderzoek grafiekinstellingen en vergelijkingen10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
mode. Wat levert het aantal ritten per vervoerswijze op?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
height_cm, mass_kg en species. Hoe kan een spreidingsdiagram soorten herkenbaar maken met zowel kleur als markeringsvorm?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 5: Los problemen met grafieken en export op10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Kom je niet uit je eigen opgave? Huiswerkhulp
Kernbegrippen
A
aggregatie
annotatie
array van grafiekgebieden
as
automatische figuurindeling
B
bandbreedte
basislijn
betrouwbaarheidsinterval
breed formaat
breedte-hoogteverhouding
C
correlatiematrix
D
DatetimeIndex
deelgrafiek per groep
divergerende kleurenschaal
doorloop van deelgrafieken naar volgende rijen
dpi
E
empirische cumulatieve verdelingsfunctie
F
FacetGrid
figuur
frequentiestaafdiagram
functie voor één grafiekgebied
functie voor een volledige figuur
G
gedeelde as
gegevenscoördinaten
gegroepeerd staafdiagram
gestapeld staafdiagram
grafiekaccessor
grafiekgebied
grafisch object
grenzen van de kleurenschaal
groepen naast elkaar plaatsen
H
herhaalde deelgrafieken
histogram
hittekaart
I
index
interkwartielafstand
K
kansdichtheid
kerndichtheidsschatting
klassengrens
kleurenbalk
kleurkoppeling
koppeling van variabelen aan visuele kenmerken
kwartiel
L
lang formaat
lijndiagram
logaritmische schaal
M
maatstreepje
markeringsoppervlakte
matrix van spreidingsdiagrammen
mozaïekindeling van deelgrafieken
N
nauwsluitend begrenzingskader
numerieke kolom
O
objectgeoriënteerde interface
omzetten naar breed formaat
omzetten naar lang formaat
oorspronkelijke schaal
opmaakfunctie voor aslabels
overlap van grafiekelementen
P
puntenstrookdiagram
R
rasterafbeelding
referentielijn
regressielijn
relatieve grafiekgebiedcoördinaten
rijnormalisatie
S
schatter
sequentiële kleurenschaal
snor
spreidingsdiagram
standaardafwijkingsband
stijlblad
T
thema
U
uitschieter
uitschietergrens
V
vectorafbeelding
verwijzing naar een figuurobject
verzameling staven
viooldiagram
Z
zwermdiagram
Over deze les
Door StudeliFout melden
Maak je eigen Studiemateriaal
Maak van je aantekeningen, slides en documenten Leermodules, Oefenvragen, Flashcards en 6 andere tools.