Hopp til innhold
Bokmål
Interaktivt innhold

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:

Verditabell

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(), som vi henter fra modulen matplotlib.pyplot. Funksjonen skal ha to argumenter. Det første argumentet skal være ei liste eller en numpy-tabell med x-verdiene fra verditabellen. Det andre argumentet skal være ei liste eller en numpy-tabell 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.

Du kan kopiere programkoden her
Python
1# Importerer ekstra moduler som ikke er standard Python
2import matplotlib.pyplot as plt # Bibliotek for grafisk framstilling
3import numpy as np # matematisk bibliotek
4
5# Definerer funksjonen
6x = np.linspace(-2, 6, 9)  # Lager liste med x-verdiene
7f_av_x = (x-2)**2-4             # Lager liste med verdiene for f(x)
8
9# Lager grafen
10plt.plot(x, f_av_x)
11
12# Tegner grafen
13plt.show()

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. Vi har gitt modulene aliasene eller navnene plt og np for å slippe å skrive så mye lenger ned i koden.

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 np. foran for å markere hvor funksjonen kommer fra.

Variabelen x er derfor en numpy-tabell 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.

Tabellen f_av_x med funksjonsverdier

Siden variabelen x er en numpy-tabell, 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 tabellen 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 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 f_av_x være

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

Funksjonen plot() – tegning av grafer

Kommandoen plt.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 plt.show() for å få den grafiske framstillingen ut fra minnet til datamaskinen og over til skjermen. Begge disse funksjonene må vi skrive plt. 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 i programmet over) ved å bruke funksjonen scatter(). Da må vi først lage ei liste av x-koordinatene til disse 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

plt.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. Det er vanlig å gi modulen aliaset plt under importen.

Tilleggsmodulen numpy

Modul som inneholder flere matematiske funksjoner, blant annet linspace(). Det er vanlig å gi modulen aliaset np under importen.

Funksjonen plot()

plt.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 eller tabellene x og f_av_x. Listene må inneholde like mange tall.

Funksjonen scatter()

plt.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:

plt.scatter([0, 1], [2, 4])

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

Funksjonen show()

plt.show()

Funksjonen er en del av modulen matplotlib.pyplot. Funksjonen viser på skjermen det grafiske innholdet laget 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 eller numpy-tabeller 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. NB! Dette går bare dersom x-verdiene er i en numpy-tabell, og det blir de når vi bruker linspace().

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å.

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.

Du kan kopiere programkoden her
Python
1# Importerer ekstra moduler som ikke er standard Python
2import matplotlib.pyplot as plt  # Bibliotek for grafiske framstillinger
3import numpy as np  # Matematisk bibliotek
4
5# Definerer funksjonen
6x = np.linspace(-2, 6, 101)
7f_av_x = (x-2)**2-4
8
9# Lager grafen inkludert tekst til tekstboks
10plt.plot(x, f_av_x, label="$f(x) = (x-2)^2-4$")
11# Med dollartegn $ får vi penere matematisk notasjon
12
13# Slår på rutenett
14plt.grid(True) 
15
16# Tar bort høyre og øvre akse og lar aksene krysse hverandre i (0, 0)
17plt.gca().spines['right'].set_visible(False)
18plt.gca().spines['top'].set_visible(False)
19plt.gca().spines['bottom'].set_position("zero")
20plt.gca().spines['left'].set_position("zero")
21
22# Lager aksetitler
23plt.xlabel("$x$") # Tittel på x-aksen
24plt.ylabel("$y$", rotation=0)
25plt.gca().yaxis.set_label_coords(0.3,1)
26plt.gca().xaxis.set_label_coords(1,0.23)
27
28# Lager tekstboks med funksjonsuttrykk
29plt.legend(bbox_to_anchor=(0.6,0.5))
30
31# Tegner grafen
32plt.show()

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 oppdatert 27.03.2026