Lese sensordata, filtrering, kalibrering og dataloggging.
Plotting og visualisering
I forskning og teknologi er det sjelden nok å bare beregne tall – vi trenger også å visualisere dataene for å oppdage mønstre, trender og sammenhenger. En god graf kan formidle mer enn en tabell med tusen tall.
I Python bruker vi biblioteket Matplotlib til å lage profesjonelle grafer og diagrammer. Matplotlib er det mest brukte plottingsbiblioteket i Python og brukes i alt fra skoleforsøk til publiserte forskningsartikler.
I dette kapittelet lærer du å:
- Lage linjediagrammer for å vise endringer over tid
- Lage stolpediagrammer for å sammenligne kategorier
- Lage punktdiagrammer (scatter plot) for å vise sammenhenger mellom variabler
- Tilpasse grafene med tittel, aksenavn, farger og rutenett
- Bruke flere delplott i ett vindu
Etter dette kapittelet vil du kunne lage profesjonelle visualiseringer av data fra eksperimenter og undersøkelser.
import matplotlib.pyplot as pltEt enkelt linjediagram lages med plt.plot():
import matplotlib.pyplot as plt
timer = [0, 1, 2, 3, 4, 5]
temperatur = [18.0, 19.2, 21.5, 23.0, 22.3, 20.1]
plt.plot(timer, temperatur)
plt.xlabel("Tid (timer)")
plt.ylabel("Temperatur (°C)")
plt.title("Temperaturutvikling")
plt.grid(True)
plt.show()Viktige funksjoner:
| Funksjon | Beskrivelse |
|---|---|
plt.plot(x, y) | Linjediagram |
plt.bar(x, y) | Stolpediagram |
plt.scatter(x, y) | Punktdiagram |
plt.xlabel() | Navn på x-aksen |
plt.ylabel() | Navn på y-aksen |
plt.title() | Tittel på grafen |
plt.grid(True) | Vis rutenett |
plt.legend() | Vis forklaring (tegnforklaring) |
plt.show() | Vis grafen på skjermen |
plt.savefig("fil.png") | Lagre grafen som bilde |
Tilpasse utseendet
Du kan gjøre grafene mer lesbare og profesjonelle med ulike tilpasninger:
import matplotlib.pyplot as plt
tid = [0, 1, 2, 3, 4, 5, 6]
inne = [21.0, 21.5, 22.0, 22.3, 22.1, 21.8, 21.2]
ute = [5.0, 6.2, 8.5, 11.0, 12.3, 10.1, 7.5]
# Linjestil og farge
plt.plot(tid, inne, "r-o", label="Inne") # rød linje med sirkler
plt.plot(tid, ute, "b--s", label="Ute") # blå stiplet med firkanter
plt.xlabel("Tid (timer)", fontsize=12)
plt.ylabel("Temperatur (°C)", fontsize=12)
plt.title("Inne- og utetemperatur", fontsize=14)
plt.legend(fontsize=11)
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()Formatstrenger for plt.plot():
- Farge: r = rød, b = blå, g = grønn, k = svart
- Linjestil: - = heltrukket, -- = stiplet, : = prikket
- Markør: o = sirkel, s = firkant, ^ = trekant, * = stjerne
Du kan kombinere: "r-o" = rød heltrukket linje med sirkelmarkører.
La oss lage et komplett linjediagram med to datasett og god formatering:
import matplotlib.pyplot as plt
# Data: Temperaturer gjennom en dag
klokkeslett = [6, 8, 10, 12, 14, 16, 18, 20, 22]
mandag = [8.0, 10.5, 14.2, 17.8, 19.1, 17.5, 14.0, 11.5, 9.0]
fredag = [5.5, 7.0, 11.8, 15.2, 16.5, 15.0, 12.3, 9.8, 7.2]
plt.figure(figsize=(10, 6))
plt.plot(klokkeslett, mandag, "r-o", label="Mandag", linewidth=2)
plt.plot(klokkeslett, fredag, "b--s", label="Fredag", linewidth=2)
plt.xlabel("Klokkeslett", fontsize=12)
plt.ylabel("Temperatur (°C)", fontsize=12)
plt.title("Temperatur gjennom dagen – mandag vs. fredag", fontsize=14)
plt.legend(fontsize=11)
plt.grid(True, alpha=0.3)
plt.xticks(klokkeslett)
plt.tight_layout()
plt.savefig("temperatur_dag.png", dpi=150)
plt.show()Forklaring av nye elementer:
- plt.figure(figsize=(10, 6)) – setter størrelsen på figuren (bredde, høyde i tommer)
- linewidth=2 – tykkere linjer for bedre synlighet
- plt.xticks(klokkeslett) – viser bare de klokkeslettene vi har data for
- plt.tight_layout() – justerer marginene slik at alt teksten får plass
- plt.savefig("temperatur_dag.png", dpi=150) – lagrer grafen som et bilde med god oppløsning
Hvilken funksjon bruker du for å lage et stolpediagram i Matplotlib?
Stolpediagram
Stolpediagram er gode for å sammenligne kategorier:
import matplotlib.pyplot as plt
fag = ["Norsk", "Matte", "Engelsk", "Naturfag", "ToF"]
snitt = [4.1, 3.8, 4.3, 3.9, 4.5]
plt.figure(figsize=(8, 5))
plt.bar(fag, snitt, color=["#e74c3c", "#3498db", "#2ecc71", "#f39c12", "#9b59b6"])
plt.ylabel("Gjennomsnittskarakter")
plt.title("Karaktersnitt per fag")
plt.ylim(1, 6) # Sett y-aksen fra 1 til 6
plt.grid(axis="y", alpha=0.3)
plt.tight_layout()
plt.show()Punktdiagram (scatter plot)
Punktdiagram brukes for å vise sammenhenger mellom to variabler:
import matplotlib.pyplot as plt
studietimer = [2, 5, 1, 8, 3, 6, 4, 7, 9, 3]
karakter = [3, 5, 2, 6, 3, 5, 4, 5, 6, 4]
plt.figure(figsize=(8, 6))
plt.scatter(studietimer, karakter, color="blue", s=80, alpha=0.7)
plt.xlabel("Studietimer per uke")
plt.ylabel("Karakter")
plt.title("Sammenheng mellom studietid og karakter")
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()Parameteren s=80 setter størrelsen på punktene, og alpha=0.7 gjør dem litt gjennomsiktige (nyttig når punkter overlapper).
La oss lage et stolpediagram som sammenligner resultater fra to klasser:
import matplotlib.pyplot as plt
fag = ["Norsk", "Matte", "Engelsk", "Naturfag"]
klasse_a = [4.2, 3.9, 4.5, 4.0]
klasse_b = [3.8, 4.3, 4.1, 4.4]
# Beregn posisjoner for stolpene
x = range(len(fag))
bredde = 0.35
plt.figure(figsize=(9, 6))
plt.bar([i - bredde/2 for i in x], klasse_a, bredde, label="Klasse A", color="#3498db")
plt.bar([i + bredde/2 for i in x], klasse_b, bredde, label="Klasse B", color="#e74c3c")
plt.xlabel("Fag", fontsize=12)
plt.ylabel("Gjennomsnittskarakter", fontsize=12)
plt.title("Karaktersammenligning mellom klasser", fontsize=14)
plt.xticks(x, fag)
plt.ylim(1, 6)
plt.legend()
plt.grid(axis="y", alpha=0.3)
plt.tight_layout()
plt.show()Forklaring: For å plassere stolpene side ved side, forskyver vi x-posisjonene med halve bredden til venstre og høyre. plt.xticks(x, fag) sørger for at fagnavnene vises midt mellom stolpeparene.
Hva gjør plt.savefig("graf.png", dpi=200) i Matplotlib?
Flere grafer i ett vindu med subplots
Noen ganger vil du vise flere grafer ved siden av hverandre for å sammenligne. Da bruker du subplots:
import matplotlib.pyplot as plt
timer = [0, 1, 2, 3, 4, 5]
temperatur = [18.0, 19.2, 21.5, 23.0, 22.3, 20.1]
luftfuktighet = [65, 60, 55, 50, 52, 58]
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
# Venstre graf: Temperatur
ax1.plot(timer, temperatur, "r-o")
ax1.set_xlabel("Tid (timer)")
ax1.set_ylabel("Temperatur (°C)")
ax1.set_title("Temperatur")
ax1.grid(True, alpha=0.3)
# Høyre graf: Luftfuktighet
ax2.plot(timer, luftfuktighet, "b-s")
ax2.set_xlabel("Tid (timer)")
ax2.set_ylabel("Luftfuktighet (%)")
ax2.set_title("Luftfuktighet")
ax2.grid(True, alpha=0.3)
fig.suptitle("Værmålinger gjennom dagen", fontsize=14)
plt.tight_layout()
plt.show()Forklaring:
- plt.subplots(1, 2) lager 1 rad med 2 kolonner (to grafer side ved side)
- plt.subplots(2, 1) ville gitt to grafer oppå hverandre
- Bruk ax1.plot() i stedet for plt.plot() når du jobber med subplots
- Metodene heter set_xlabel(), set_ylabel() og set_title() i stedet for plt.xlabel() osv.
Her er et komplett eksempel som leser data og lager flere visualiseringer:
import matplotlib.pyplot as plt
# Eksperimentdata: Pendelperiode som funksjon av lengde
lengder = [0.10, 0.20, 0.30, 0.40, 0.50, 0.60, 0.70, 0.80, 0.90, 1.00]
perioder = [0.63, 0.90, 1.10, 1.27, 1.42, 1.55, 1.67, 1.79, 1.90, 2.01]
# Beregn teoretisk verdi: T = 2*pi*sqrt(L/g)
import math
g = 9.81
teoretisk = [2 * math.pi * math.sqrt(L / g) for L in lengder]
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
# Graf 1: Målt vs. teoretisk
ax1.scatter(lengder, perioder, color="red", s=60, label="Målt", zorder=5)
ax1.plot(lengder, teoretisk, "b-", label="Teoretisk", linewidth=2)
ax1.set_xlabel("Pendellengde (m)", fontsize=12)
ax1.set_ylabel("Periode (s)", fontsize=12)
ax1.set_title("Pendelperiode vs. lengde", fontsize=13)
ax1.legend(fontsize=11)
ax1.grid(True, alpha=0.3)
# Graf 2: Avvik mellom målt og teoretisk
avvik = [m - t for m, t in zip(perioder, teoretisk)]
ax2.bar(range(len(avvik)), avvik, color="#e74c3c", alpha=0.7)
ax2.set_xlabel("Måling nr.", fontsize=12)
ax2.set_ylabel("Avvik (s)", fontsize=12)
ax2.set_title("Avvik fra teoretisk verdi", fontsize=13)
ax2.axhline(y=0, color="black", linewidth=0.8)
ax2.grid(axis="y", alpha=0.3)
fig.suptitle("Pendelforsøk – analyse", fontsize=15)
plt.tight_layout()
plt.savefig("pendelforsok.png", dpi=150)
plt.show()Programmet viser et typisk vitenskapelig plott: målte verdier som punkter, teoretisk kurve som linje, og et avviksdiagram for å vurdere målenøyaktigheten.
Lag et Python-program som lager et stolpediagram over gjennomsnittlig nedbør per måned for et år. Bruk disse dataene (mm): Jan: 49, Feb: 36, Mar: 47, Apr: 41, Mai: 53, Jun: 65, Jul: 81, Aug: 89, Sep: 90, Okt: 84, Nov: 73, Des: 55. Diagrammet skal ha tittel, aksenavn og passende farger.
Oppsummering
I dette kapittelet har du lært å:
- Importere og bruke Matplotlib for plotting (import matplotlib.pyplot as plt)
- Lage linjediagrammer med plt.plot() for å vise endringer over tid
- Lage stolpediagrammer med plt.bar() for å sammenligne kategorier
- Lage punktdiagrammer med plt.scatter() for å vise sammenhenger
- Tilpasse grafer med tittel, aksenavn, farger, rutenett og tegnforklaring
- Bruke formatstrenger for å styre farge, linjestil og markører
- Lage subplots for å vise flere grafer i ett vindu
- Lagre grafer som bildefiler med plt.savefig()
Gode vaner for vitenskapelig visualisering:
- Alltid inkluder aksenavn med enheter (f.eks. «Temperatur (°C)»)
- Bruk tegnforklaring (legend) når du har flere datasett
- Velg diagramtype som passer dataene: linje for tidsserier, stolpe for kategorier, scatter for sammenhenger
- Lagre grafer med høy oppløsning (dpi=150 eller mer) for bruk i rapporter
Skriv et program som simulerer et kast med to terninger 1000 ganger. Programmet skal: a) Bruke random.randint(1, 6) for hvert kast. b) Telle opp hvor mange ganger hver sum (2–12) forekommer. c) Lage et stolpediagram som viser antall forekomster for hver sum. d) Legge til en horisontal linje som viser gjennomsnittet.
Lag et program som visualiserer Ohms lov (). Programmet skal: a) Definere en motstand . b) Beregne spenning for strømverdier fra 0 til 0.5 A (bruk 20 punkter). c) Lage et subplot med to grafer: (1) linjediagram av vs. , og (2) stolpediagram av effekten for 5 utvalgte strømverdier. d) Lagre figuren som ohms_lov.png.
Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.