CMD + K

Informasjonsteknologi grunnkursMatplotlib og visualiseringBegreper & formler6
6 min lesing1 video

Matplotlib og visualisering

Med matplotlib gjør vi tall om til figurer vi kan forstå. Vi lager en figur, tegner data med plot og scatter, og setter på akser, etiketter og tittel. God visualisering er ofte forskjellen mellom rådata og innsikt.

Læringsmål
  • 01Importere matplotlib.pyplot som plt og lage en enkel graf med plot og show
  • 02Forklare forskjellen på figur og akser, og hvordan et datapunkt (x, y) plasseres i koordinatsystemet
  • 03Velge mellom plot og scatter ut fra om dataene er en sekvens eller en samling
  • 04Gjøre en graf lesbar med tittel, akseetiketter og legend, og tegne flere kurver i samme figur

Fra tall til bilde

Du har en liste med målinger — temperaturen time for time gjennom et døgn, salgstall per måned, eller resultatene fra et forsøk. Som ren tekst på skjermen sier de lite. Men tegn dem opp som en kurve, og mønsteret hopper ut: når steg det, hvor var toppen, finnes det en trend? Det er nettopp dette matplotlib gjør for deg. Matplotlib er det mest brukte biblioteket for å lage grafer i Python, og det spiller tett sammen med NumPy: du regner ut tallene med arrays, og tegner dem med Matplotlib.

> Mest relevant for TDT4110. Matplotlib går dypere i 4110 enn i 4109.

Et minimalt eksempel viser hele ideen. Vi har noen x-verdier og noen tilhørende y-verdier, og ber Matplotlib trekke en linje mellom punktene:

python
import matplotlib.pyplot as plt x = [0, 1, 2, 3, 4] y = [0, 1, 4, 9, 16] plt.plot(x, y) plt.show()

Importlinjen er nesten alltid den samme: import matplotlib.pyplot as plt. Modulen pyplot er den delen av Matplotlib du jobber mot mest, og kortnavnet plt er en konvensjon hele Python-verdenen har blitt enige om. Når du ser plt i andres kode, vet du at det er Matplotlib.

04016xyplt.plot binder punktene sammen med en linje. Fordi y vokser som kvadratet av x, krummer kurven oppover. Matplotlib finner aksegrensene fra dataene selv.
FIGKurven y = x i andre tegnet med plt.plot

Figuren over viser nettopp denne kurven: y vokser som kvadratet av x, så den krummer oppover. Legg merke til at Matplotlib selv finner ut hvor langt aksene skal gå ut fra dataene dine — du trenger ikke regne ut det selv.

Figur og akser — lerretet du tegner på

For å bruke Matplotlib trygt er det verdt å skille to ord som lett blandes. En figure er hele lerretet, hele bildet du til slutt får ut. Inni figuren ligger ett eller flere koordinatsystem, og hvert slikt koordinatsystem med sine to akser er der selve kurvene tegnes. I de fleste enkle programmer trenger du ikke tenke på skillet, fordi plt.plot(...) lager både figur og akser automatisk bak kulissene. Men når du vil ha flere grafer i samme bilde, eller styre størrelsen nøye, dukker skillet opp.

En akse går fra en minste til en største verdi og har en retning.

(3, 9)Et punkt (x, y) plasseres ved å gå x langs den vannrette x-aksen og y opp langs den loddrette y-aksen. Det er det samme koordinatsystemet som i matematikken.
FIGEt datapunkt (3, 9) i koordinatsystemet

viser hvordan x-aksen løper vannrett og y-aksen loddrett, og hvordan et datapunkt (x, y) plasseres ved å gå x til høyre og y opp fra origo. Dette er det samme koordinatsystemet du kjenner fra matematikken, og Matplotlib bygger all tegning på det.

Vil du av og til overstyre hvor langt aksene går — kanskje for å zoome inn eller for å tvinge y til å starte i null — kan du bruke plt.xlim(...) og plt.ylim(...). Men start uten dem: la Matplotlib velge grensene automatisk, og grip inn først hvis den automatiske visningen skjuler noe du vil ha frem. Det er en god regel for hele biblioteket — bruk standardvalgene til de ikke holder, og legg på finjustering bit for bit.

Linjer eller prikker — plot mot scatter

Matplotlib har mange tegnemåter, men to dekker det meste du trenger i starten. plot trekker en sammenhengende linje mellom punktene i den rekkefølgen de kommer. Det passer når x-verdiene er ordnet og det gir mening å «binde dem sammen» — tid som går, en funksjon som beveger seg jevnt.

scatter tegner i stedet hvert punkt som en løs prikk, uten linje mellom. Det passer når du har par av målinger der rekkefølgen ikke betyr noe — høyde mot vekt for en gruppe mennesker, eller pris mot størrelse for et knippe boliger. Da vil du se skyen av punkter, ikke en linje som hopper kaotisk frem og tilbake.

python
import matplotlib.pyplot as plt hoyde = [165, 170, 175, 180, 185] vekt = [60, 68, 72, 80, 88] plt.scatter(hoyde, vekt) plt.show()

En tommelfingerregel: spør deg om punktene danner en sekvens (bruk plot) eller en samling (bruk scatter). Velger du feil, blir grafen vanskelig å lese, selv om tallene er riktige.

Gjør grafen lesbar — etiketter og tittel

En graf uten forklaring er nesten verdiløs. Hva står på aksene? Hva er enheten? En etikett på hver akse, satt med plt.xlabel(...) og plt.ylabel(...), og en tittel satt med plt.title(...), er forskjellen på en figur leseren forstår og en de må gjette seg til. Dette er ikke pynt — det er en del av å kommunisere et resultat ærlig.

matplotlib

En komplett, merket graf

python
import matplotlib.pyplot as plt # 1) Regn ut dataenex = [0, 1, 2, 3, 4, 5]y = [verdi ** 2 for verdi in x]   # [0, 1, 4, 9, 16, 25] # 2) Tegn demplt.plot(x, y) # 3) Merk aksene og gi en tittelplt.title("y = x i andre")plt.xlabel("x")plt.ylabel("y") # 4) Vis figuren — uten denne blir det ingen grafplt.show()

Rekkefølgen er fast: regn ut data, tegn, merk aksene og gi tittel, og kall til slutt plt.show(). Glemmer du show(), bygges bildet i minnet men vises aldri.

Snutten over samler de byggesteinene du bruker oftest, i den rekkefølgen de hører hjemme. Først regner vi ut dataene, så tegner vi dem, så merker vi aksene og gir figuren en tittel, og helt til slutt kaller vi plt.show(). Akkurat den siste linjen er lett å glemme: uten show() blir det aldri noe bilde på skjermen. Tenk på plt.show() som «nå er jeg ferdig, vis meg resultatet» — alt du gjorde før den, har bare bygget opp bildet i minnet.

Flere kurver i samme figur

Ofte vil du sammenligne. Hvordan ser to funksjoner ut ved siden av hverandre, eller to måleserier? Det enkleste er å kalle plt.plot(...) flere ganger før du kaller plt.show(). Hvert kall legger en ny kurve oppå de forrige, i samme koordinatsystem:

python
import matplotlib.pyplot as plt x = [0, 1, 2, 3, 4] plt.plot(x, [v for v in x], label="lineær") plt.plot(x, [v * v for v in x], label="kvadratisk") plt.xlabel("x") plt.ylabel("y") plt.legend() plt.show()

Når flere kurver deler samme figur, trenger leseren å vite hvilken som er hvilken. Det er det label="..." på hver plot og plt.legend() til slutt sørger for: en liten forklaringsboks som kobler farge til navn.

04016xyplt.plot binder punktene sammen med en linje. Fordi y vokser som kvadratet av x, krummer kurven oppover. Matplotlib finner aksegrensene fra dataene selv.
FIGKurven y = x i andre tegnet med plt.plot

kunne fått en slik andre kurve på samme vis — Matplotlib velger automatisk en ny farge for hvert kall, slik at de skilles ut.

Et helt lite analyse-program

La oss knytte det sammen med noe som ligner en ekte oppgave. Tenk deg at du har målt gjennomsnittstemperaturen for hver måned i et år og vil se forløpet:

python
import matplotlib.pyplot as plt maaned = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] temp = [-4, -3, 1, 6, 11, 15, 17, 16, 11, 6, 1, -2] plt.plot(maaned, temp) plt.title("Gjennomsnittstemperatur per maaned") plt.xlabel("Maaned") plt.ylabel("Grader Celsius") plt.show()

Resultatet er en kurve som stiger mot sommeren og faller mot vinteren — en form du øyeblikkelig kjenner igjen, og som de tolv tallene alene aldri ville avslørt like raskt. Det er hele poenget med visualisering: den lar øyet gjøre arbeidet hjernen ellers måtte streve med. Når du senere bruker NumPy til å regne ut store mengder data, blir Matplotlib måten du faktisk ser hva du har regnet ut.

Legg merke til at x- og y-listen i eksempelet er like lange — tolv måneder, tolv temperaturer. Det er et krav: Matplotlib parer det første x-tallet med det første y-tallet, det andre med det andre, og så videre. Er listene ulikt lange, får du en feilmelding i stedet for en graf. Dette er en av de vanligste snublesteinene for nybegynnere, og verdt å sjekke først når noe ikke virker. En annen er rekkefølgen på plt.show(): alt du vil ha med i bildet, må kalles før den linjen, for show() tegner det som er bygd opp så langt og nullstiller.

Et siste råd: bygg grafen i små steg og kjør ofte. Tegn først den nakne kurven og se at den ser rimelig ut, legg så på etiketter og tittel, og legg til en kurve om gangen hvis du sammenligner. Da oppdager du raskt om noe står feil, i stedet for å stirre på et ferdig, men forvirrende bilde. Matplotlib er enormt — det finnes hundrevis av innstillinger for farger, stiplede linjer, rutenett og delgrafer — men de håndfull kallene du har sett her dekker det aller meste av det du trenger for å gjøre data om til innsikt.

Mine notater

Skriv egne notater for dette kapittelet. De lagres automatisk og dukker opp i «Mine notater»-oversikten paa fag-siden.

Laster…