Tilbake
5.6
Sensordata og databehandling

5.6 Sensordata og databehandling

Lese sensordata, filtrering, kalibrering og dataloggging.

30 min
5 oppgaver
SensordataFiltreringKalibreringDatalogging
Du leser den tradisjonelle versjonen
Din fremgang i kapitlet
0 / 5 oppgaver

Plotting og visualisering

I forsking og teknologi er det sjeldan nok å berre rekne ut tal – vi treng òg å visualisere dataa for å oppdage mønster, trendar og samanhengar. Ein god graf kan formidle meir enn ein tabell med tusen tal.

I Python brukar vi biblioteket Matplotlib til å lage profesjonelle grafar og diagram. Matplotlib er det mest brukte plottingsbiblioteket i Python og blir brukt i alt frå skuleforsøk til publiserte forskingsartiklar.

I dette kapittelet lærer du å:
- Lage linjediagram for å vise endringar over tid
- Lage stolpediagram for å samanlikne kategoriar
- Lage punktdiagram (scatter plot) for å vise samanhengar mellom variablar
- Tilpasse grafane med tittel, aksenamn, fargar og rutenett
- Bruke fleire delplott i eitt vindauge

Etter dette kapittelet vil du kunne lage profesjonelle visualiseringar av data frå eksperiment og undersøkingar.

Matplotlib – grunnleggjande bruk
Matplotlib er eit Python-bibliotek for plotting og visualisering. Vi importerer det slik:

import matplotlib.pyplot as plt

Eit enkelt linjediagram blir laga 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 funksjonar:

FunksjonSkildring
plt.plot(x, y)Linjediagram
plt.bar(x, y)Stolpediagram
plt.scatter(x, y)Punktdiagram
plt.xlabel()Namn på x-aksen
plt.ylabel()Namn på y-aksen
plt.title()Tittel på grafen
plt.grid(True)Vis rutenett
plt.legend()Vis forklaring (teiknforklaring)
plt.show()Vis grafen på skjermen
plt.savefig("fil.png")Lagre grafen som bilete

Tilpasse utsjånaden

Du kan gjere grafane meir lesbare og profesjonelle med ulike tilpassingar:

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()

Formatstrengar for plt.plot():
- Farge: r = raud, b = blå, g = grøn, k = svart
- Linjestil: - = heiltrekt, -- = stipla, : = prikka
- Markør: o = sirkel, s = firkant, ^ = trekant, * = stjerne

Du kan kombinere: "r-o" = raud heiltrekt linje med sirkelmarkørar.

✏️Linjediagram – temperaturmålingar

Lat oss lage eit 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 element:
- plt.figure(figsize=(10, 6)) – set storleiken på figuren (breidd, høgd i tommar)
- linewidth=2 – tjukkare linjer for betre synlegheit
- plt.xticks(klokkeslett) – viser berre dei klokkesletta vi har data for
- plt.tight_layout() – justerer margane slik at all teksten får plass
- plt.savefig("temperatur_dag.png", dpi=150) – lagrar grafen som eit bilete med god oppløysing

📝Oppgave 1

Kva for ein funksjon brukar du for å lage eit stolpediagram i Matplotlib?

Stolpediagram

Stolpediagram er gode for å samanlikne kategoriar:

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 blir brukt for å vise samanhengar mellom to variablar:

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 set storleiken på punkta, og alpha=0.7 gjer dei litt gjennomsiktige (nyttig når punkt overlappar).

✏️Stolpediagram med fleire kategoriar

Lat oss lage eit stolpediagram som samanliknar resultat frå to klassar:

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 stolpane side ved side, forskyv vi x-posisjonane med halve breidda til venstre og høgre. plt.xticks(x, fag) sørgjer for at fagnamna blir viste midt mellom stolpepara.

📝Oppgave 2

Kva gjer plt.savefig("graf.png", dpi=200) i Matplotlib?

Fleire grafar i eitt vindauge med subplots

Nokre gonger vil du vise fleire grafar ved sida av kvarandre for å samanlikne. Då brukar 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) lagar 1 rad med 2 kolonnar (to grafar side ved side)
- plt.subplots(2, 1) ville gitt to grafar oppå kvarandre
- Bruk ax1.plot() i staden for plt.plot() når du jobbar med subplots
- Metodane heiter set_xlabel(), set_ylabel() og set_title() i staden for plt.xlabel() osv.

✏️Komplett visualisering av eksperimentdata

Her er eit komplett døme som les data og lagar fleire visualiseringar:

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 eit typisk vitskapleg plott: målte verdiar som punkt, teoretisk kurve som linje, og eit avviksdiagram for å vurdere målenøyaktigheita.

📝Oppgave 3

Lag eit Python-program som lagar eit stolpediagram over gjennomsnittleg nedbør per månad for eit år. Bruk desse dataa (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, aksenamn og passande fargar.

Oppsummering

I dette kapittelet har du lært å:

- Importere og bruke Matplotlib for plotting (import matplotlib.pyplot as plt)
- Lage linjediagram med plt.plot() for å vise endringar over tid
- Lage stolpediagram med plt.bar() for å samanlikne kategoriar
- Lage punktdiagram med plt.scatter() for å vise samanhengar
- Tilpasse grafar med tittel, aksenamn, fargar, rutenett og teiknforklaring
- Bruke formatstrengar for å styre farge, linjestil og markørar
- Lage subplots for å vise fleire grafar i eitt vindauge
- Lagre grafar som biletfiler med plt.savefig()

Gode vanar for vitskapleg visualisering:
- Inkluder alltid aksenamn med einingar (f.eks. «Temperatur (°C)»)
- Bruk teiknforklaring (legend) når du har fleire datasett
- Vel diagramtype som passar dataa: linje for tidsseriar, stolpe for kategoriar, scatter for samanhengar
- Lagre grafar med høg oppløysing (dpi=150 eller meir) for bruk i rapportar

📝Oppgave 4

Skriv eit program som simulerer eit kast med to terningar 1000 gonger. Programmet skal: a) Bruke random.randint(1, 6) for kvart kast. b) Telje opp kor mange gonger kvar sum (2–12) førekjem. c) Lage eit stolpediagram som viser talet på førekomstar for kvar sum. d) Leggje til ei horisontal linje som viser gjennomsnittet.

📝Oppgave 5

Lag eit program som visualiserer Ohms lov (U=RIU = R \cdot I). Programmet skal: a) Definere ein motstand R=100ΩR = 100 \, \Omega. b) Rekne ut spenning UU for straumverdiar II frå 0 til 0.5 A (bruk 20 punkt). c) Lage eit subplot med to grafar: (1) linjediagram av UU vs. II, og (2) stolpediagram av effekten P=UIP = U \cdot I for 5 utvalde straumverdiar. 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.