Uke 12 - matplotlib / CSV

Obs

matplotlib er et eksternt bibliotek som vi må installere først i terminalen:

python -m pip install --user matplotlib

Du må kanskje erstatte «python» med en full path (den som vises når du bruker kjøreknappen i VSCode). F.eks: /Users/myusername/.../bin/python

Matplotlib

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 uke, denne uken skal vi bare bruke vanlige lister som input.

Om du er interessert kan du finne flere eksempler til bruk av matplotlib på Sample Plots.

Her er et enkelt eksempel på pyplot (eksempel_1.py):

import matplotlib.pyplot as plt
from math import sin

# 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 * sin(x) for x in xs]

plt.plot(xs, ys_1, "-.r")
plt.plot(xs, ys_2, "--b")

# savefig lagrer filene
plt.savefig("test.png")
plt.savefig("test.pdf")

# interaktivt vindu
plt.show()

Denne koden produserer følgende plot:

../_images/eksempel_1.png

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

Her er et eksempel på flere grafer ved siden av hverandre (eksempel_2.py):

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

Denne koden produserer følgende plot:

../_images/eksempel_2.png

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

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

Denne koden produserer følgende plot:

../_images/eksempel_3.png

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

  • Hvordan lager du en plot?

  • Hvordan får du etiketter på x- og y-aksen i din plot?

  • Hvordan får du en titel høyest opp på din plot?

  • Hvordan bestemmer du farge og mønstre på grafen?

  • Hvordan får du flere grafer oppå hverandre?

  • Hvordan får du flere grafer ved siden av hverandre?

CSV bibliotek

CSV er et enkelt tekstbasert filformat for tabeller. Hver linje holder komma-separerte verdier (CSV: Comma-separated values). Vi skal bare gå gjennom et eksempel her, men «Automate»-boken har mer om CSV i kapittel 16 for de som er interessert.

CSV modulen er fortsett ganske «low-level», og mange skritt i dataanalyse må skrives for hånd. Den eksterne pandas-biblioteken som vi skal se litt på senere, tar bort mange av disse kjedelige oppgavene.

Oppgaver

Oppgave 1

Skriv en funsjon read_first_col som skriver ut verdier fra den første kolonnen på filen 2019-06-01_Oslo.csv.

Eksempelkjøring:

-5.141
12.7172
11431
...

Oppgave 2

Skriv en funksjon write_to_csv som tar to argumenter: et filnavn og en liste med rader.

Funksjonen skal lage en ny fil med filnavnet og skrive hver rad på en ny linje i csv-format.

Eksempel:

Hvis vi har denne lista:

rows = [
      ["Come Together", 4, 20, "Lennon/McCartney"],
      ["Something", 3, 3, "Harrison"],
      ["Maxwell's Silver Hammer", 3, 27, "Lennon/McCartney"],
      ["Oh! Darling", 3, 26, "Lennon/McCartney"],
      ["Octopus's Garden", 2, 51, "Starr"],
      ["I want you", 7, 47, "Lennon/McCartney"],
  ]

og kjører:

write_to_csv("Abbey_Road.csv", rows)

skal vi lage en fil som heter Abbey_Road.csv og inneholder:

Come Together,4,20,Lennon/McCartney
Something,3,3,Harrison
Maxwell's Silver Hammer,3,27,Lennon/McCartney
Oh! Darling,3,26,Lennon/McCartney
Octopus's Garden,2,51,Starr
I want you,7,47,Lennon/McCartney

Oppgave 3

Endre på koden i eksempel 1 slik at grafene tegnes med en annen farge og stil. Du kan velge farge og stil selv.

NB: Filen du leverer skal hete uke12_oppgave_3.py.

Oppgave 4

Ta plottingen fra eksempel 1 og legg til minor ticks (undermerker) til x og y-aksen.

NB: Filen du leverer skal hete uke12_oppgave_4.py.

Tips Søk i dokumentasjonen til matplotlib for den enkleste løsning. Dette er mulig å løse med bare én kodelinje.

Oppgave 5

Ta plottingen fra eksempel 1 og legg til en pil til det første interseksjon-punktet (ikke på 0,0!) med kommenten: Første interseksjonen. Du trenger ikke å regne ut posisjonen i programmet, du kan estimere den. Husk å søke på matplotlib-dokumentasjonen.

NB: Filen du leverer skal hete uke12_oppgave_5.py.

Oppgave 6 - CSV

  1. Endre uke12_oppgave_6a.py og skriv ut antall bedrifter som produserer hver enkelt art (ART, kolonne 12)

  2. Endre uke12_oppgave_6b.py og plott kun bedriftene som oppdrar Laks (ART, kolonne 12)

  3. Endre uke12_oppgave_6c.py og plott FERSKVANN og SALTVANN med ulike farger (se på VANNMILJØ, kolonne 20)

  4. Endre uke12_oppgave_6d.py og kom på et annet interessant spørsmål om datasettet og implementer det.

Testene i 6c sjekker bare at koden kjører, de ser ikke på outputet. Det skjer kun manuelt når vi retter