Intro 3: Diagram i Python#

I denna övning ska vi se på de verktyg Python erbjuder för att skapa grafer utgående från listor. När vi förstår verktygen kan vi ta listor från tabeller med statistik, och på så sätt visualisera dem. Vi börjar med att läsa in funktionspaketen som behövs, och dataset som ska användas i några övningar och exempel.

import matplotlib.pyplot as plt  # matplotlib.pyplot innehåller verktyg för att rita grafer och diagram.
import pandas as pd              # pandas låter oss läsa in en datafil och spara den som en variabel i python.
import numpy as np               
energi = pd.read_csv("files/global-energy-substitution.csv")
energi.head()
Year Wind (TWh) Oil (TWh) Nuclear (TWh) Hydropower (TWh) Biomass (TWh) Other renewables (TWh) Biofuels (TWh) Solar (TWh) Coal (TWh) Gas (TWh)
0 1800 0 0 0 0 5556 0 0 0 97 0
1 1810 0 0 0 0 5833 0 0 0 128 0
2 1820 0 0 0 0 6111 0 0 0 153 0
3 1830 0 0 0 0 6389 0 0 0 264 0
4 1840 0 0 0 0 6944 0 0 0 356 0

Diagram#

Vi ska se på några typer av diagram. Funktionspaketet matplotlib.pyplot låter oss rita diagram utgående från listor av värden. Vi ska lära oss använda funktionerna plt.bar(), plt.scatter(), plt.hist() och plt.plot().

Dessa kan rita diagram utgående från listor som du själv antecknar direkt i programmet, eller listor som är tagna ur en DataFrame importerad med pandas.

Vi vill också snygga till diagramen lite med följande kommandon. Du kan se i kodcellerna nedan hur de används.

fig = plt.figure(figsize=(8, 5))  # Startkommando (ej nödvändigt)

plt.title("title")    # Rubrik
plt.xlabel("label")   # x-axelns rubrik
plt.ylabel("label")   # y-axelns rubrik

plt.xlim(lower, upper)  # välj vilket område som visas
plt.ylim(lower, upper)

plt.legend()          # Förklaringsruta
plt.grid()            # Rutsystem

plt.show()            # Avslutande kommando

Stapeldiagram med plt.bar()#

För att rita ett stapeldiagram krävs två listor. En med staplarnas höjder (mätvärden, antal, frekvenser etc.) och en med staplarnas namn.

Vi gör ett enkelt exempel med påhittade listor.

namn = ["Små grisar", "Små gummor", "Små apor", "Bröder", "Dvärgar"]
antal = [3, 3, 10, 7, 7]                          # Det är viktigt att listorna innehåller lika många element.

plt.bar(namn, antal)
<BarContainer object of 5 artists>
../_images/intro_3_diagram_i_python_8_1.png

Vi ritar samma diagram igen, men denna gång lägger vi till rubriker för tydlighet. Vi inleder också med .figure-kommandot som kan bestämma figurens storlek, och avslutar med .show-kommandot som gör resultatet snyggare.

fig = plt.figure(figsize = (6,4))

plt.bar(namn, antal)

plt.title("Antal sagofigurer", fontsize = 16)
plt.xlabel("Typ av figurer")
plt.ylabel("Antal")

plt.show()
../_images/intro_3_diagram_i_python_10_0.png

Uppgift:#

Gör ett eget stapeldiagram. Skapa listor själv - hitta på något, eller välj ett av följande exempel:

  • Antal bilar av varje bilmärke på skolans parkering

  • Antal födelsedagar per månad bland alla i klassen

Punktdiagram med plt.scatter()#

Precis som plt.bar(), behöver plt.scatter() ha två listor med värden - x och y. Funktionen ritar sedan in dessa värdepar som punkter i ett koordinatsystem.

Vi gör ett exempel där vi ritar in punkter för en parabel, \(y \ = \ x^2\):

xvarden = [-3, -2, -1, 0, 1, 2, 3]
yvarden = [9, 4, 1, 0, 1, 4, 9]

fig = plt.figure(figsize = (4,4))
plt.scatter(xvarden, yvarden)

plt.grid()
plt.show()
../_images/intro_3_diagram_i_python_14_0.png

Graf med plt.plot()#

Om vi istället för punkter vill ha en sammanbunden linje, kan vi använda plt.plot() på samma sätt som i föregående exempel.

Vi testar:

xvarden = [-3, -2, -1, 0, 1, 2, 3]
yvarden = [9, 4, 1, 0, 1, 4, 9]

fig = plt.figure(figsize = (4,4))
plt.plot(xvarden, yvarden)

plt.grid()
plt.show()
../_images/intro_3_diagram_i_python_17_0.png

Vi märker att den här parabeln blir ganska “low resolution”. När man faktiskt ska rita en graf brukar man inte skriva ut alla punkter. Vi gör det så här istället:

x = np.linspace(-3, 3, 100)  # Skapar en lista med 100 värden från -3 till 3
y = x**2                     # Beräknar en lista med y-värden utgående från de 100 x-värdena. ** är potensfunktionen.

fig = plt.figure(figsize = (4,4))
plt.plot(x, y)

plt.grid()
plt.show()
../_images/intro_3_diagram_i_python_19_0.png

plt.plot-kommandot kommer till användning när vi ska åskådliggöra statistiktabeller. Istället för att konstruera x- och y-listorna som vi gjorde nyss kan vi använda värden ur tabellen.

I början av dokumentet hämtade vi in en tabell över världens energiproduktion. Se till att du har kört den cellen. Om vi nu vill ha en tabell som visar mängden oljekraft som producerats genom åren kan vi ta x-och y-listorna från tabellen. Tabellen heter energi, så för att ta en kolumn ur tabellen kan vi skriva kommandot energi[‘KolumnensNamn’]

year = energi['Year']
oil = energi['Oil (TWh)']

Övning:#

Funktion#

Välj en matematisk funktion att avbilda i ett koordinatsystem som i exemplen ovan. Välj en på egen hand, eller ta ett av förslagen nedan.

  • Sinusfunktionen. Du kan använda np.sin(x) för att beräkna sinusvärden.

  • Den naturliga exponentialfunktionen. Du kan använda np.e för att få nepers tal.

  • En logaritmfunktion. Du kan exempelvis använda funktionen np.log(x) för den naturliga logaritmen, eller np.log10(x) för logaritmen med bas 10.

Statistik#

  1. I cellen nedan skapar vi x- och y-listor (year och oil). Använd dem för att skapa en graf med plt.plot().

  2. Skapa fler y-listor (wind, solar…). Skriv fler plt.plot-kommandon med olika y-listor och samma x-lista (year). De kan visas i samma diagram.

  3. Lägg till titel och namnge koordinataxlarna.

# Koda här (Funktion)
# Koda här (Statistik)

Histogram med plt.hist()#

Till skillnad från de tidigare funktionerna använder plt.hist() bara en värdelista. För att testa funktionen skapar vi en lista med slumpmässiga värden.

import numpy.random as rand        # Random-paketet innehåller slumpfunktioner
histlist = []                      # Vi gör en tom lista, och fyller den sen.

for i in range(1000):                            # Detta är en for-loop. range(n) betyder att den upprepas n gånger.
    i = rand.randint(1,11)*rand.randint(1,11)    # Vi skapar ett slumpvärdevärde som produkten av två heltal från 1 till 10.
    histlist.append(i)                           # .append-kommandot lägger till värdet i listan.

# Med print-kommandot kan man titta på listan.
# Du kan ta bort #-tecknet om du vill:
# print(histlist)

Vi har en slumpmäsigt vald lista. Vi använder kommandot plt.hist utan extra parametrar. Då skapas ett histogram med 10 staplar, som börjar vid det lägsta värdet och slutar vid det högsta.

plt.hist(histlist)

plt.show()
../_images/intro_3_diagram_i_python_30_0.png

Detta är kanske inte ett så tydligt histogram. Det finns några enkla saker vi kan göra för att snygga till det. Vi lägger till informativa benämningar för axlarna med xlabel och ylabel, och använder följande parametrar till plt.hist().

bins = antal bestämmer antalet staplar. 10 staplar används om inget värde anges.

range=(lower, upper) bestämmer var den första stapeln börjar och den sista slutar, om man inte vill använda de automatiskt valda gränserna.

edgecolor = ‘black’ kan användas för att lättare urskilja staplarna. Man kan även använda kortversionen ec = ‘k’

plt.hist(histlist, bins=10, range=(0,100), edgecolor = 'black')

plt.xlabel("Slumptal")
plt.ylabel("Frekvens")

plt.show()
../_images/intro_3_diagram_i_python_32_0.png

Steget vidare#

Nu känner du till de viktigaste visuella verktygen som finns till ditt förfogande när du använder Python. Jupyter Notebooks är dokument som lämpar sig bra för att växla förklarande texter med programmering eller beräkningar, och är därför bra att använda till labbrapporter och liknande arbeten.

Om du vill göra fler övningar med statistik- och datahantering hittar du sådana i vårt material. Om du vill öva på egen hand kan du söka data från webbsidorna som nämns på vår hemsida.

Lycka till!