Utforskning: pyplot

Les også: utforsking om tidevann. Fysikk-innholdet der er selvfølgelig ikke pensum, vi tok det med som et eksempel til et litt større prosjekt.


Matplotlib er et bibliotek du må installere før du kan bruke det. Se kursnotater om eksterne pakker.


Matplotlib: visualisering av data

https://matplotlib.org/

Matplotlib er et stort bibliotek med utallige muligheter for å visualisere data på ulike måter. Under viser vi bare et helt enkelt eksempel;

import matplotlib.pyplot as plt
from math import sin, cos

# Eksempeldata som skal visualiseres
# liste med x-verdier
xs = [n / 10 for n in range(101)]
# 2 ulike lister med y-verdier
ys_1 = [sin(x) for x in xs]
ys_2 = [3 * cos(x) for x in xs]

# Opprette et plot
plt.plot(xs, ys_1, "r")
plt.plot(xs, ys_2, "b")

# savefig lagrer filene
plt.savefig("my_plot.svg")  # SVG vektorgrafikk (bra format for figurer!)
plt.savefig("my_plot.pdf")  # PDF
plt.savefig("my_plot.png")  # PNG 


# interaktivt vindu
plt.show()

Hva skjer om vi ikke har med den siste raden: plt.show()?

Basic plot

Du kan bruke matplotlib til å visualisere data. Slik som de fleste python-biblioteker, har matplotlib en veldig god dokumentasjon på nettet. Her skal vi bare se på noen enkle bruk av biblioteken.

Les gjennom intro to pyplot. De bruker et annet eksternt bibliotek, numpy, i noen av eksemplene for å lage lister med verdier, vi skal se på numpy neste gang.

Om du er interessert kan du finne flere eksempler til bruk av matplotlib på plot types.

Flere grafer ved siden av hverandre
import matplotlib.pyplot as plt
from math import sin

xs = [n / 10 for n in range(101)]
ys = [sin(x) for x in xs]

plt.subplot(221)
plt.plot(xs, ys, "-.r")
plt.ylabel("y")

plt.subplot(222)
plt.plot(xs, [3 * y for y in ys], "--y")

plt.subplot(223)
plt.plot(xs, ys, "-.k")
plt.xlabel("x")

plt.subplot(224)
plt.plot(xs, [3 * y for y in ys], "--b")

plt.suptitle("Several plots")
plt.show()

Koden over produserer følgende:

Illustrasjon av koden over

Flere datapunkter, høyere oppløsning

Jo flere datapunkter du bruker, desto høyere oppløsning får grafen din. Her er et eksempel på dette

import matplotlib.pyplot as plt
from math import sin

def square_wave(x):
    return ( # bruker parentes her slik at vi kan formatere over flere linjer
        sin(x)
        + 1 / 3 * sin(3 * x)
        + 1 / 5 * sin(5 * x)
        + 1 / 7 * sin(7 * x)
        + 1 / 9 * sin(9 * x)
    )

# Lower resolution
xs = [n / 5 for n in range(51)]
ys = [square_wave(x) for x in xs]
plt.plot(xs, ys, label="51 points")

# Higher resolution
xs = [n / 100 for n in range(1001)]
ys = [square_wave(x) for x in xs]
plt.plot(xs, ys, label="1001 points")

# plot labels
plt.title("Resolution example")
plt.xlabel("x")
plt.ylabel("y")
plt.legend()

plt.show()

Koden over produserer følgende:

Illustrasjon av koden over

Utforskningsspørsmål

Svar på følgende spørsmål om pyplot: