Teikne grafar med pyplot - Matematikk R1 - NDLA

Hopp til innhald
Verktøy og mal

Teikne grafar med pyplot

Vi kan bruke programmeringsspråket Python til å teikne grafar.

Innleiing

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

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

for x-verdiar mellom -2 og 6.

Grafteikning med modulen pyplot

Akkurat som når vi skal teikne ein funksjon på papiret, treng vi ein ferdig utfylt verditabell med x-verdiar og funksjonsverdiar. 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 teiknar vi grafar med funksjonen plot(). Funksjonen skal ha to argument. Det første argumentet skal vere ei liste med x-verdiane frå verditabellen. Det andre argumentet skal vere ei liste med dei tilhøyrande funksjonsverdiane.

Lista med x-verdiane lagar vi med funksjonen linspace(). Lista med funksjonsverdiane lagar vi så direkte ut ifrå lista med x-verdiar. Deretter bruker vi kommandoen plot() til å lage grafen. Til slutt må vi bruke kommandoen show() for å sende den grafiske framstillinga til skjermen.

Oppgåve – algoritme

Prøv ut ifrå opplysningane ovanfor å skrive ein algoritme til eit program som skal teikne funksjonen f for oss.

Løysingsforslag
  • Lag ei liste med dei heile tala frå og med -2 til og med 6, og kall lista x.
  • Lag ei liste med dei tilhøyrande funksjonsverdiane, og kall lista f_av_x.
  • Lag den grafiske framstillinga.
  • Send den grafiske framstillinga til skjermen.

Kommentar: Vi kan ikkje bruke parentesar i eit variabelnamn i Python. Derfor kallar vi lista med funksjonsverdiar for f_av_x sidan "f(x)" ikkje kan brukast.

Pythonprogrammet nedanfor fungerer etter algoritmen over. (NB: Det kan ta litt tid frå du trykkjer på avspelingsknappen til programmet blir køyrt.) Alternativt kan du kopiere koden inn i din eigen programmeringseditor. Får du fram grafen til funksjonen? Legg merke til at teiknet hashtag (#) gjer at vi inne i programkoden kan leggje inn tekst som blir ignorert og som derfor kan brukast til å leggje til kommentarar i koden.

Forklaring til programkoden

Importering av tilleggsmodular eller tilleggsbibliotek til Python

I linje 2 og 3 har vi importert modulen pyplot frå biblioteket matplotlib og modulen numpy. Det er fordi funksjonane vi bruker ikkje finst i standard Python.

Funksjonen linspace()

I linje 6 bruker vi funksjonen linspace(). Funksjonen linspace() finst ikkje i standard Python, men ligg innunder modulen numpy. Då må vi skrive numpy. framfor for å markere kvar funksjonen kjem frå.

Variabelen x er derfor ei liste med 9 tal der det minste er -2. Funksjonen linspace fordeler dei 9 tala jamt i intervallet frå og med -2 til og med 6. Tala aukar derfor jamt med 1 frå -2 heilt opp til det største talet, 6.

Lista f_av_x med funksjonsverdiar

Sidan variabelen x er ei liste, vil òg variabelen f_av_x vere det fordi f_av_x er definert ut ifrå x i linje 7. Heldigvis kan vi lage lista f_av_x ved å setje lista x rett inn i funksjonen, slik linje 7 viser. Sidan det første talet i x er -2, vil det første talet i lista f_av_x vere

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

Spørsmål – koding

Kva er det siste talet i lista f_av_x?

Svar

Sidan det siste talet i x er 6, vil det siste talet i lista f_av_x vere

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

Funksjonen plot() – teikning av grafar

Kommandoen plot(x, f_av_x) lagar den grafiske framstillinga ved å teikne ei rett linje mellom punkta av samhøyrande verdiar av x og f_av_x. Til slutt treng vi kommandoen show() for å få den grafiske framstillinga ut frå minnet til datamaskina og over til skjermen. Begge desse funksjonane må vi skrive matplotlib.pyplot. framfor for å informere om at dei kjem frå modulen pyplot i biblioteket matplotlib.

Teikning av punkt

Vi har frå verditabellen til funksjonen ovanfor at

  • nullpunkta er  x=0  og  x=4
  • botnpunktet har koordinatane (2, –4)

Vi kan teikne nullpunkta og botnpunktet (saman med grafen) ved å bruke funksjonen scatter(). Då må vi først lage ei liste av x-koordinatane til punkta og ei like lang liste med dei tilsvarande y-koordinatane. Sjå sida "Lister" for meir om korleis ein definerer ei liste i Python.

Vi lagar lista x_koord med x-koordinatane til dei tre punkta ved å skrive kommandoen

x_koord = [0, 4, 2]

Spørsmål – koding

Kva blir rett kommando for å lage lista y_koord med dei tilhøyrande y-koordinatane?

Svar

y_koord = [0, 0, -4]

Det er viktig at rekkjefølgja på y-koordinatane er den same som rekkjefølgja på x-koordinatane i den andre lista. Dersom x-koordinaten til botnpunktet er det tredje talet i lista x_koord, må y-koordinaten til botnpunktet tilsvarande vere det tredje talet i lista y_koord.

Til slutt teiknar vi desse tre punkta ved å skrive

matplotlib.pyplot.scatter(x_koord, y_koord)

Skriv inn desse tre linjene i programmet ovanfor, og kontroller at dei tre punkta kjem på rett plass.

Pythonkode å lære seg

Vis innhald

Tilleggsmodulen matplotlib.pyplot

Modul som inneheld funksjonar for å lage grafiske framstillingar

Tilleggsmodulen numpy

Modul som inneheld fleire matematiske funksjonar, mellom anna linspace()

Funksjonen plot()

matplotlib.pyplot.plot(x, f_av_x)

Funksjonen er ein del av modulen matplotlib.pyplot. Funksjonen lagar ein graf ut ifrå samhøyrande talverdiar i dei (numeriske) listene x og f_av_x. Listene må innehalde like mange tal.

Funksjonen scatter()

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

Funksjonen er ein del av modulen matplotlib.pyplot. Funksjonen teiknar punkt ut ifrå ei liste med x-koordinatar og ei (like lang) liste med y-koordinatar.

Eksempel:

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

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

Funksjonen show()

matplotlib.pyplot.show()

Funksjonen er ein del av modulen matplotlib.pyplot. Funksjonen viser på skjermen det grafiske innhaldet laga med funksjonane plot() og scatter().

Spesielt for plotting med Jupyter Notebook

Dersom du kopierer programkoden over til programmeringsmiljøet Jupyter Notebook, vil kanskje ikkje grafen kome fram når du køyrer koden. Skriv då følgjande kode på eiga linje rett etter importen av matplotlib.pyplot:

%matplotlib inline

Skrive kommentarar i pythonkode

Tekst som kjem etter ein hashtag (#) i programkoden blir ignorert.

Eksempel:

# Denne teksten blir ignorert.

Arbeide med den grafiske framstillinga

I den interaktive programmeringseditoren kan du dra i linja som skil kodedelen frå grafen for å få grafbiletet litt større, om du vil.

Spørsmål – vurdering

Kva er innvendingane mot den grafiske framstillinga laga med Python samanlikna med korleis vi vanlegvis ville ha teikna ein slik graf?

Svar
  • Grafen går i hakk i staden for å vere ei jamt avrunda kurve.
  • Det manglar koordinataksar som kryssar kvarandre i origo.
  • Det manglar aksetitlar.
  • Det manglar rutenett.

Lage pent avrunda graf

Korleis kan vi, ved å endre på eitt av tala i programkoden, få grafen til å bli jamt avrunda og ikkje hakkete?

Tips

Intervallet grafen skal teiknast over, må delast opp i mindre delar.

Svar

Vi må dele opp intervallet frå og med -2 til og med 6 i mindre delar, gjerne så mange som 100. Då må vi endre det tredje talet i argumentet til funksjonen linspace().

Prøv dette, og sjå korleis grafen endrar seg.

Oppsummering

Skriv og prøv å forklare så nøyaktig som mogleg kva funksjonane plot() og scatter() gjer, og korleis vi bruker dei.

Forklaring

Funksjonen plot() tek to argument: to variablar som er lister med like mange tal. Listene blir av funksjonen oppfatta som samhøyrande x- og y-verdiar til punkt på grafen. Lista med x-verdiane lagar vi enklast med funksjonen linspace(), sidan tala må kome i stigande rekkjefølgje. For at grafen ikkje skal bli kantete, må tala i lista med x-verdiane kome tett nok sidan plot() teiknar rette linjer frå punkt til punkt. Lista med y-verdiane lagar vi ved å setje lista med x-verdiane inn i funksjonen vi skal teikne.

Funksjonen scatter() tek òg to argument: to variablar som er lister med like mange tal. Listene blir av funksjonen oppfatta som samhøyrande x- og y-verdiar til punkt, og funksjonen teiknar punkta som små sirklar.

Det vi skriv om nedanfor, gjer du berre om du ikkje er nøgd med den grafiske framstillinga slik ho er no. Vi viser òg eit triks for å spare tastetrykk.

Tilleggsstoff: Finpussing på den grafiske framstillinga

Ved å ikkje gi nokon vilkår til den grafiske framstillinga laga med pythonkode, vil vi få det oppsettet som er standard, slik vi har fått over. Det finst veldig mange måtar å justere på ei grafisk framstilling i Python. Her viser vi berre nokre få av dei.

Sjølve grafen til funksjonen vår ser rett ut slik han er no, men for å få den grafiske framstillinga til å likne meir på GeoGebra-biletet, må vi leggje inn nokre fleire kommandoar. Prøv å køyre koden nedanfor.

Ved å skrive ...as plt og ...as np i linjene 2 og 3 lagar vi forkortingar som gjer at vi ikkje treng å skrive heile adressa til modulane når vi skal bruke funksjonar frå dei. I staden for å skrive matplotlib.pyplot. framfor alle funksjonane vi bruker frå dette biblioteket, held det no å skrive plt. .

Legg merke til at tekstboksen med formelrepresentasjonen av funksjonen på utskrifta ser nokså matematisk ut. Det er fordi vi på linje 10 har starta og avslutta tekststrengen med dollarteiknet $. Dette trikset slår på "matematisk" vising av teksten mellom dollarteikna (ved hjelp av noko som heiter LaTeX).

Du treng kanskje ikkje lære deg desse nye funksjonane utanåt. Det kan vere verdt å vite at på linje 25 og 26 skriv vi inn koordinatane for kvar aksetitlane skal plasserast. NB: Dette koordinatsystemet følgjer ikkje koordinatsystemet til funksjonen vi teiknar, men eit koordinatsystem der origo er i nedre venstre hjørne på den grafiske framstillinga. Øvre høgre hjørne har koordinatane (1, 1).

Plasseringa av tekstboksen med funksjonsuttrykket er funne ved å prøve og feile med koordinatane til "bbox_to_anchor". Vi kan plassere tekstboksen med funksjonsuttrykket øvst til høgre ved å gje "bbox_to_anchor" verdien "(1, 1)".

Spørsmål – koding

Kva blir koordinatane til midtpunktet på den grafiske framstillinga med dette systemet?

Svar

Koordinatane til midtpunktet blir (0.5, 0.5).

Skrive av Bjarne Skurdal.
Sist fagleg oppdatert 06.06.2022