Tegne grafer med pyplot
Innledning
Vi skal bruke programmeringsspråket Python til å tegne grafen til funksjonen
for -verdier mellom og .
Graftegning med modulen pyplot
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.
Løsningsforslag
- Lag ei liste med de hele tallene fra og med til og med , 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 "" 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 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
?
Svar
Siden det siste tallet i x
er , vil det siste tallet i lista f_av_x
være
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 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?
Svar
y_koord = [0, 0, -4]
Det er viktig at rekkefølgen på -koordinatene er den samme som rekkefølgen på -koordinatene i den andre lista. Dersom -koordinaten til bunnpunktet er det tredje tallet i lista x_koord
, må -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 -koordinater og ei (like lang) liste med
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
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
Funksjonen scatter() tar også to argumenter: to variabler som er lister med like mange tall. Listene blir av funksjonen oppfattet som samhørende
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).