Datahåndtering I: Visualisering#

Læringsutbytte

Etter å ha arbeidet med dette temaet, skal du kunne:

  1. bruke matplotlib-biblioteket til visualisering

  2. plotte datapunkter og funksjoner

  3. lage og tolke ulike visualiseringer

Håndtering av data blir bare viktigere og viktigere med tida. En viktig del av datahåndtering er å kunne generere fine og informative figurer som beskriver dataene på en god måte. Det blir stadig vanligere å bruke programmering til dette. Det finnes flere typer biblioteker som kan gi oss fine og profesjonelle figurer. Vi begynner med et mye brukt bibliotek som heter matplotlib.

Plotting av lister#

Hvis vi har få datapunkter, kan vi skrive dem inn i lister direkte i programmet vårt og plotte dem. La oss ta et eksempel der vi har målt damptrykket til vann i et glassrør ved ulike temperaturer. Vi har fått følgende data:

Temperatur (grader C)

Damptrykk (kPa)

16

1.817

18

2.063

20

2.339

22

2.644

24

2.984

import matplotlib.pyplot as plt
import numpy as np
T = [16, 18, 20, 22, 24]                    # Temperatur i grader celsius
trykk = [1.817, 2.063, 2.339, 2.644, 2.984] # Damptrykk i kPa
plt.plot(T,trykk)                           # Plotter y som funksjon av x
plt.show()                                  # Viser plottet
../../_images/4d7a7765820d29743713784a683e0bd208f9c5dd386f3c27e371662a107107d7.png

Hvis vi har lyst til å modifisere og pynte på plottet, har vi mange muligheter til det. Her er noen forslag til en del nyttige endringer av plottet ovenfor:

plt.plot(T,trykk,color="limegreen",marker="o",linestyle="--")
plt.title("Vanndamptrykk i et glassrør") # Tittel på plottet
plt.xlabel("Temperatur ($^o$C)") # Aksetittel på x-aksen
plt.ylabel("Damptrykk (kPa)") # Aksetittel på y-aksen
plt.xlim(16,24) # Definisjonsmengde
plt.ylim(1.5,3) # Verdimengde
plt.grid() # Slår på rutenett
plt.show()
../../_images/8df152d4438ddb0ed7210b7a284b68167b51d4df1619a57ac4e1f5fd0fe3f2e8.png

Det finnes utrolig mange måter å modifisere et plott på. Tabellene nedenfor viser en oversikt over nyttige plottekommandoer, linjestiler, markører og farger, som du kan bruke for å lage akkurat den figuren du ønsker. Du bør også søke litt rundt på nettet for å finne andre muligheter, for eksempel ved å søke på «python plotting colors» og liknende. Du må bruke internett flittig når du lurer på noe i programmering!

En veldig nyttig kommando når vi skal representere flere grafer i samme koordinatsystem, er legend. Denne kommandoen viser merkelappene (“labels”) til de ulike plottene. Programmet nedenfor gir et eksempel på dette.

Underveisoppgave

Programmet nedenfor plotter miljøgifter i ulike organismer i to innsjøer. Studer programmet og eksperimenter med ulike verdier fra tabellen nedenfor.

plot(x,y)         # plotter x mot y og trekker rette linjer mellom
scatter(x,y)      # plotter kun punkter
show()            # viser plottet

title("tittel")   # tittel på plottet
xlabel("tekst")   # x-aksetittel
ylabel("tekst")   # y-aksetittel
xlim(fra, til)    # definisjonsmengde
ylim(fra, til)    # verdimengde
grid()            # rutenett på

axhline(y=0, color='black') # x-akse
axvline(x=0, color='black') # y-akse

Inni plottekommandoen kan vi også legge til farger, linjestiler, markører, merkelapper og liknende:

plot(x,y,color="",marker="",linestyle="",label="")

Markør

Forklaring

“.”

punkt

“o”

sirkel

” ” (mellomrom)

ingen markør

“^”

triangel opp

“v”

triangel ned

“s”

firkant

“p”

femkant

Linjestil

Forklaring

“-”

heltrukket linje

“–”

stipla linje (lange)

“;”

stipla linje (korte)

“-.”

stilpa linje (annenhver kort/lang)

” ” (mellomrom)

ingen linje

farger

Plotting av funksjoner#

En datamaskin kan bare håndtere diskrete verdier, altså ikke-uendelige tallmengder. En matematisk funksjon kan derimot være kontinuerlig og ha uendelig mange funksjonsverdier. På en datamaskin må vi tilnærme denne uendelige mengden med et ganske stort antall. Dette kan vi gjøre med for eksempel linspace-kommandoen. Programmet nedenfor plotter funksjonen \(f(x) = 2x^2 - 2x + 1\) for \(x\in[-2, 3]\)

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-2, 3, 1000) # lager 1000 x-verdier mellom -2 og 3
y = 2*x**2 - 2*x + 1 # lager 1000 tilsvarende y-verdier til en funksjon

plt.plot(x,y)
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
plt.show()
../../_images/39262e8437160fc0fa4e41b0e69a987e656a9e9c5a941c22c4744177ab496591.png

Det Python egentlig gjør når den plotter funksjoner, er å plotte et bestemt antall punkter og “tegne” rette linjer mellom disse punktene. Dette kalles “lineær interpolasjon”. Det blir tydelig dersom vi kun velger ut fem punkter å plotte funksjonen i.

x = np.linspace(-2, 3, 5) # lager 5 x-verdier mellom -2 og 3
y = 2*x**2 - 2*x + 1      # lager 5 tilsvarende y-verdier til en funksjon

plt.plot(x,y,marker='o')
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
plt.show()
../../_images/aa41fff3f835f7cf1dd52cea254b0b821e3bfa8892eff69382ca3e0d390f3349.png

Dersom vi definerer en Python-funksjon, kan vi også bruke denne til å generere y-verdier:

def f(x):
    return 2*x**2 - 2*x + 1 

x = np.linspace(-2, 3, 1000) # lager 5 x-verdier mellom -2 og 3
y = f(x)                     # lager 1000 tilsvarende y-verdier til en funksjon

plt.plot(x,y,)
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
plt.show()
../../_images/39262e8437160fc0fa4e41b0e69a987e656a9e9c5a941c22c4744177ab496591.png

Underveisoppgave

Plott tre funksjoner i samme koordinatsystem. Eksperimenter med farger, linjestiler og annet. Husk aksetitler!

Flere plott i samme figur#

Dersom vi ønsker å lage flere plott i samme figur, kan vi bruke kommandoen subplot(antall rader, antall kolonner, figurnummer) for å plotte flere grafer samtidig. Her er et eksempel:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 50)
y = np.sin(x)
 
plt.subplot(2, 1, 1)   # To rader, én kolonne, figur 1
plt.plot(x, y, color = "green", linestyle = "--")
plt.title("Grønn stiplekurve")

plt.subplot(2, 1, 2)            # To rader, én kolonne, figur 2
plt.plot(x, y, color = "red", linestyle = " ", marker = "o")
plt.title("Rød prikkekurve")
plt.tight_layout()              # Fikser slik at det ikke blir overlapp mellom f.eks. aksetitler

plt.show()
#plt.savefig("kulfigur.png")    # Lagrer figuren på datamaskinen din
../../_images/33b384dd47c247be7b66b45b566ae5db1a30328e352f4eb057a7643b84d25224.png

Underveisoppgave

Modifiser figuren ovenfor slik at plottene vises ved siden av hverandre i samme figur istedenfor under hverandre.

Vi kan også lage flere funksjoner i samme koordinatsystem. Da bruker vi labels (merkelapper) for å skille mellom de ulike grafene, og legend for å vise merkelappene i koordinatsystemet.

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-2, 3, 10)

def f(x):
    return x**2 - 2*x

def g(x):
    return np.sin(x)

def h(x):
    return - x + 6

y1 = f(x)
y2 = g(x)
y3 = h(x)

plt.plot(x,y1,color='lawngreen',label='f(x)', marker='^') # Bruker merkelapp (label) for å skille mellom kurvene
plt.plot(x,y2,color='maroon',label='g(x)', marker='o')
plt.plot(x,y3,color='deepskyblue',label='h(x)', marker='s')
plt.legend() # Viser merkelappene
plt.xlabel('x')
plt.ylabel('y')
plt.axhline(y=0,color='black') # Tegner x-akse
plt.axvline(x=0,color='black') # Tegner y-akse
plt.grid()
plt.show()
../../_images/eb4b7cdef67ea97baa3824f25528788261cdd5a727b7f8966584447e00741370.png

Underveisoppgave

Plott tre av dine favorittfunksjoner i samme koordinatsystem. Tilpass akser og tittel og pynt på plottet.

Videoer#

I videoen nedenfor kan du få en innføring eller repetisjon i hvordan du plotter i Python.