Hopp til innhold
Verktøy og mal

Tegne grafer med pyplot

Vi kan bruke programmeringsspråket Python til å tegne grafer.

Innledning

Vi skal bruke programmeringsspråket Python til å tegne grafen til funksjonen

f(x)=(x-2)2-4

for x-verdier mellom -2 og 6.

Graftegning med modulen pyplot

Akkurat som når vi skal tegne en funksjon på papiret, trenger vi en ferdig utfylt verditabell med x-verdier og funksjonsverdier. Verditabellen til funksjonen f ser slik ut:

x

–2

–1

0

1

2

3

4

5

6

fx

12

5

0

–3

–4

–3

0

5

12

I Python tegner vi grafer med funksjonen plot(). Funksjonen skal ha to argumenter. Det første argumentet skal være ei liste med x-verdiene fra verditabellen. Det andre argumentet skal være ei liste med de tilhørende funksjonsverdiene.

Lista med x-verdiene lager vi med funksjonen linspace(). Lista med funksjonsverdiene lager vi så direkte ut ifra lista med x-verdier. Deretter bruker vi kommandoen plot() til å lage grafen. Til slutt må vi bruke kommandoen show() for å sende den grafiske framstillingen til skjermen.

Oppgave – algoritme

Prøv ut ifra opplysningene ovenfor å skrive en algoritme til et program som skal tegne funksjonen f for oss.

Løsningsforslag
  • Lag ei liste med de hele tallene fra og med -2 til og med 6, og kall lista x.
  • Lag ei liste med de tilhørende funksjonsverdiene, og kall lista f_av_x.
  • Lag den grafiske framstillingen.
  • Send den grafiske framstillingen til skjermen.

Kommentar: Vi kan ikke bruke parenteser i et variabelnavn i Python. Derfor kaller vi lista med funksjonsverdier for f_av_x siden "f(x)" ikke kan brukes.

Pythonprogrammet nedenfor fungerer etter algoritmen over. (NB: Det kan ta litt tid fra du trykker på avspillingsknappen til programmet blir kjørt.) Alternativt kan du kopiere koden inn i din egen programmeringseditor. Får du fram grafen til funksjonen? Legg merke til at tegnet hashtag (#) gjør at vi inne i programkoden kan legge inn tekst som blir ignorert og som derfor kan brukes til å legge til kommentarer i koden.

Forklaring til programkoden

Importering av tilleggsmoduler eller tilleggsbibliotek til Python

I linje 2 og 3 har vi importert modulen pyplot fra biblioteket matplotlib og modulen numpy. Det er fordi funksjonene vi bruker ikke finnes i standard Python.

Funksjonen linspace()

I linje 6 bruker vi funksjonen linspace(). Funksjonen linspace() finnes ikke i standard Python, men ligger innunder modulen numpy. Da må vi skrive numpy. foran for å markere hvor funksjonen kommer fra.

Variabelen x er derfor ei liste med 9 tall der det minste er -2. Funksjonen linspace fordeler de 9 tallene jevnt i intervallet fra og med -2 til og med 6. Tallene øker derfor jevnt med 1 fra -2 helt opp til det største tallet, 6.

Lista f_av_x med funksjonsverdier

Siden variabelen x er ei liste, vil også variabelen f_av_x være det fordi f_av_x er definert ut ifra x i linje 7. Heldigvis kan vi lage lista f_av_x ved å sette lista x rett inn i funksjonen, slik linje 7 viser. Siden det første tallet i x er -2, vil det første tallet i lista f_av_x være

f-2=-2-22-4=16-4=12

Spørsmål – koding

Hva er det siste tallet i lista f_av_x?

Svar

Siden det siste tallet i x er 6, vil det siste tallet i lista f_av_x være

f6=6-22-4=16-4=12

Funksjonen plot() – tegning av grafer

Kommandoen plot(x, f_av_x) lager den grafiske framstillingen ved å tegne ei rett linje mellom punktene av samhørende verdier av x og f_av_x. Til slutt trenger vi kommandoen show() for å få den grafiske framstillingen ut fra minnet til datamaskinen og over til skjermen. Begge disse funksjonene må vi skrive matplotlib.pyplot. foran for å informere om at de kommer fra modulen pyplot i biblioteket matplotlib.

Tegning av punkt

Vi har fra verditabellen til funksjonen ovenfor at

  • nullpunktene er  x=0  og  x=4
  • bunnpunktet har koordinatene (2, –4)

Vi kan tegne nullpunktene og bunnpunktet (sammen med grafen) ved å bruke funksjonen scatter(). Da må vi først lage ei liste av x-koordinatene til punktene og ei like lang liste med de tilsvarende y-koordinatene. Se siden "Lister" for mer om hvordan man definerer ei liste i Python.

Vi lager lista x_koord med x-koordinatene til de tre punktene ved å skrive kommandoen

x_koord = [0, 4, 2]

Spørsmål – koding

Hva blir rett kommando for å lage lista y_koord med de tilhørende y-koordinatene?

Svar

y_koord = [0, 0, -4]

Det er viktig at rekkefølgen på y-koordinatene er den samme som rekkefølgen på x-koordinatene i den andre lista. Dersom x-koordinaten til bunnpunktet er det tredje tallet i lista x_koord, må y-koordinaten til bunnpunktet tilsvarende være det tredje tallet i lista y_koord.

Til slutt tegner vi disse tre punktene ved å skrive

matplotlib.pyplot.scatter(x_koord, y_koord)

Skriv inn disse tre linjene i programmet ovenfor, og kontroller at de tre punktene kommer på riktig plass.

Pythonkode å lære seg

Vis innhold

Tilleggsmodulen matplotlib.pyplot

Modul som inneholder funksjoner for å lage grafiske framstillinger

Tilleggsmodulen numpy

Modul som inneholder flere matematiske funksjoner, blant annet linspace()

Funksjonen plot()

matplotlib.pyplot.plot(x, f_av_x)

Funksjonen er en del av modulen matplotlib.pyplot. Funksjonen lager en graf ut ifra samhørende tallverdier i de (numeriske) listene x og f_av_x. Listene må inneholde like mange tall.

Funksjonen scatter()

matplotlib.pyplot.scatter(liste med x-verdier, liste med y-verdier)

Funksjonen er en del av modulen matplotlib.pyplot. Funksjonen tegner punkt ut ifra ei liste med x-koordinater og ei (like lang) liste med y-koordinater.

Eksempel:

matplotlib.pyplot.scatter([0, 1], [2, 4])

Kommandoen tegner punkta (0, 2) og (1, 4).

Funksjonen show()

matplotlib.pyplot.show()

Funksjonen er en del av modulen matplotlib.pyplot. Funksjonen viser på skjermen det grafiske innholdet lagd med funksjonene plot() og scatter().

Spesielt for plotting med Jupyter Notebook

Dersom du kopierer programkoden over til programmeringsmiljøet Jupyter Notebook, vil kanskje ikke grafen komme fram når du kjører koden. Skriv da følgende kode på egen linje rett etter importen av matplotlib.pyplot:

%matplotlib inline

Skrive kommentarer i pythonkode

Tekst som kommer etter en hashtag (#) i programkoden blir ignorert.

Eksempel:

# Denne teksten blir ignorert.

Arbeide med den grafiske framstillingen

I den interaktive programmeringseditoren kan du dra i linja som skiller kodedelen fra grafen for å få grafbildet litt større, om du vil.

Spørsmål – vurdering

Hva er innvendingene mot den grafiske framstillingen lagd med Python sammenlignet med hvordan vi vanligvis ville ha tegnet en slik graf?

Svar
  • Grafen går i hakk i stedet for å være en jevnt avrundet kurve.
  • Det mangler koordinatakser som krysser hverandre i origo.
  • Det mangler aksetitler.
  • Det mangler rutenett.

Lage pent avrundet graf

Hvordan kan vi, ved å endre på ett av tallene i programkoden, få grafen til å bli jevnt avrundet og ikke hakkete?

Tips

Intervallet grafen skal tegnes over, må deles opp i mindre deler.

Svar

Vi må dele opp intervallet fra og med -2 til og med 6 i mindre deler, gjerne så mange som 100. Da må vi endre det tredje tallet i argumentet til funksjonen linspace().

Prøv dette, og se hvordan grafen endrer seg.

Oppsummering

Skriv og prøv å forklare så nøyaktig som mulig hva funksjonene plot() og scatter() gjør, og hvordan vi bruker dem.

Forklaring

Funksjonen plot() tar to argumenter: to variabler som er lister med like mange tall. Listene blir av funksjonen oppfattet som samhørende x- og y-verdier til punkt på grafen. Lista med x-verdiene lager vi enklest med funksjonen linspace(), siden tallene må komme i stigende rekkefølge. For at grafen ikke skal bli kantete, må tallene i lista med x-verdiene komme tett nok siden plot() tegner rette linjer fra punkt til punkt. Lista med y-verdiene lager vi ved å sette lista med x-verdiene inn i funksjonen vi skal tegne.

Funksjonen scatter() tar også to argumenter: to variabler som er lister med like mange tall. Listene blir av funksjonen oppfattet som samhørende x- og y-verdier til punkt, og funksjonen tegner punktene som små sirkler.

Det vi skriver om nedenfor, gjør du bare om du ikke er fornøyd med den grafiske framstillingen slik den er nå. Vi viser også et triks for å spare tastetrykk.

Tilleggsstoff: Finpussing på den grafiske framstillingen

Ved å ikke gi noen vilkår til den grafiske framstillingen lagd med pythonkode, vil vi få det oppsettet som er standard, slik vi har fått over. Det finnes veldig mange måter å justere på en grafisk framstilling i Python. Her viser vi bare noen få av dem.

Selve grafen til funksjonen vår ser rett ut slik den er nå, men for å få den grafiske framstillingen til å ligne mer på GeoGebra-bildet, må vi legge inn noen flere kommandoer. Prøv å kjøre koden nedenfor.

Ved å skrive ...as plt og ...as np i linjene 2 og 3 lager vi forkortelser som gjør at vi ikke trenger å skrive hele adressen til modulene når vi skal bruke funksjoner fra dem. I stedet for å skrive matplotlib.pyplot. foran alle funksjonene vi bruker fra dette biblioteket, holder det nå å skrive plt. .

Legg merke til at tekstboksen med formelrepresentasjonen av funksjonen på utskriften ser nokså matematisk ut. Det er fordi vi på linje 10 har startet og avsluttet tekststrengen med dollartegnet $. Dette trikset slår på "matematisk" visning av teksten mellom dollartegnene (ved hjelp av noe som heter LaTeX).

Du trenger kanskje ikke lære deg disse nye funksjonene utenat. Det kan være verdt å vite at på linje 25 og 26 skriver vi inn koordinatene for hvor aksetitlene skal plasseres. NB: Dette koordinatsystemet følger ikke koordinatsystemet til funksjonen vi tegner, men et koordinatsystem der origo er i nedre venstre hjørne på den grafiske framstillingen. Øvre høyre hjørne har koordinatene (1, 1).

Plasseringen av tekstboksen med funksjonsuttrykket er funnet ved å prøve og feile med koordinatene til "bbox_to_anchor". Vi kan plassere tekstboksen med funksjonsuttrykket øverst til høyre ved å gi "bbox_to_anchor" verdien "(1,1)".

Spørsmål – koding

Hva blir koordinatene til midtpunktet på den grafiske framstillingen med dette systemet?

Svar

Koordinatene til midtpunktet blir (0.5, 0.5).

Skrevet av Bjarne Skurdal.
Sist faglig oppdatert 06.06.2022