Uke 12 - matplotlib / CSV ========================= .. note:: matplotlib er et eksternt bibliotek som vi må installere først:: 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). 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 (:download:`eksempel_1.py`): .. literalinclude:: eksempel_1.py Denne koden produserer følgende plot: .. image:: 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 (:download:`eksempel_2.py`): .. literalinclude:: eksempel_2.py Denne koden produserer følgende plot: .. image:: eksempel_2.png Jo flere datapunkter du bruker, desto høyere oppløsning får grafen din. Her er et eksempel på dette (:download:`eksempel_3.py`): .. literalinclude:: eksempel_3.py Denne koden produserer følgende plot: .. image:: 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. .. toctree:: :maxdepth: 1 csv/index 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. Obligatoriske oppgaver ---------------------- Del 1 - CSV ........... a. Endre ``del_1a.py`` og skriv ut antall bedrifter som produserer hver enkelt art (*ART*, kolonne 12) b. Endre ``del_1b.py`` og plott kun bedriftene som oppdrar *Laks* (*ART*, kolonne 12) c. Endre ``del_1c.py`` og plott *FERSKVANN* og *SALTVANN* med ulike farger (se på *VANNMILJØ*, kolonne 20) d. Endre ``del_1d.py`` og kom på et annet interessant spørsmål om datasettet og implementer det. **Testene i del 1 sjekker bare at koden kjører, de ser ikke på outputet. Det skjer kun manuelt når vi retter** Del 2 - Hage ............ Du og naboen din har begge like store hager. Hagene deres representeres som 2D-lister, hvor ``garden[i][j]``, gir et element på posisjonen ``(i, j)``. Hvert element i en hage er representert som en streng, og kan være en av de følgende: ``"grass", "moss", "strawberry", "rock", "raspberry"``. Du har i det siste sett at det har blitt litt vel mye mose og stein i hagen din, og mistenker at det er naboen din som har lagt det der. For å fikse opp i dette, skal du fullføre funksjonen ``clean_garden(my_garden, neighbors_garden)``. Her skal du først lage små funksjoner for å gjøre det enklere å løse den faktiske oppgaven. Til slutt skal du bytte ut hvert stein og mose fra din hage, med den første jordbær og bringebær fra naboen sin hage som finnes (de to ting som skal byttes trenger *ikke* å være på samme posisjon). **Lag en funksjon** ``find_item`` som tar inn to argumenter: ``(garden, item)``, som returnerer en ``(i, j)`` posisjon som en tuppel, hvis ``item`` finnes i ``garden``. Hvis det ikke finnes, returnerer du ``None`` **Lag en funksjon** ``swap_items`` som bytter ut to elementer mellom to hager, la den ta inn disse argumentene: ``(garden1, garden2, pos1, pos2)``, hvor ``pos1`` og ``pos2`` er ``(i, j)`` tupler. Her skal du ikke returnere noe, men endre listene du får inn som argumenter. **Bruk funksjonene du har definert for å fullføre** ``clean_garden(my_garden, neighbors_garden)``: Bytt ut all "rock" med "strawberry", og "moss" med "raspberry" fra naboen sin hage så lenge det finnes muligheter for bytte.