Tegne grafer med pyplot
Vi skal bruke programmeringsspråket Python til å tegne grafen til funksjonen
for -verdier mellom og .
Akkurat som når vi skal tegne en funksjon på papiret, trenger vi en ferdig utfylt verditabell med -verdier og funksjonsverdier. Verditabellen til funksjonen ser slik ut:
–2 | –1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | |
---|---|---|---|---|---|---|---|---|---|
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 -verdiene fra verditabellen. Det andre argumentet skal være ei liste med de tilhørende funksjonsverdiene.
Lista med -verdiene lager vi med funksjonen linspace(). Lista med funksjonsverdiene lager vi så direkte ut ifra lista med -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 for oss.
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.
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 tall der det minste er . Funksjonen linspace fordeler de tallene jevnt i intervallet fra og med til og med . Tallene øker derfor jevnt med fra helt opp til det største tallet, .
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 , vil det første tallet i lista f_av_x
være
Spørsmål – koding
Hva er det siste tallet i lista f_av_x
?
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.
Vi har fra verditabellen til funksjonen ovenfor at
- nullpunktene er og
- 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 -koordinatene til punktene og ei like lang liste med de tilsvarende -koordinatene. Se siden "Lister" for mer om hvordan man definerer ei liste i Python.
Vi lager lista x_koord
med -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 -koordinatene?
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.
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?
Lage pent avrundet graf
Hvordan kan vi, ved å endre på ett av tallene i programkoden, få grafen til å bli jevnt avrundet og ikke hakkete?
Oppsummering
Skriv og prøv å forklare så nøyaktig som mulig hva funksjonene plot() og scatter() gjør, og hvordan vi bruker dem.
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.
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?