Hur smidigt hade det inte varit att kunna skapa professionella diagram utan att behöva använda program som Excel eller LibreOffice Spreadsheet? Det kan vi faktiskt. Python har ett mycket användbart bibliotek för just detta, nämligen Matplotlib.

Matplotlib är ett bibliotek för Python för att kunna skapa just diagram och grafer för både tryck och visning på skärmen. Matplotlib kan användas både i Pythonskript och interaktivt via Python- eller IPython-skalet så att man får en miljö som liknar t.ex. MATLAB.

Först av allt måste vi visa hur man installerar de paket som krävs för att det ska fungera. Därefter visar vi några exempel på olika typer av diagram. Här kommer vi endast att gå igenom den mest grundläggande (men kanske viktigaste) användningen för Matplotlib. Ofta använder man Matplotlib tillsammans med NumPy och Pandas för att sammanställa stora datamängder. Matplotlib tillsammans med NumPy och Pandas gör att man får en nästan komplett MATLAB-liknande miljö – dessutom helt gratis. Men här kommer vi idag bara att gå igenom själva skapandet av diagrammen.

Installera Python3 och Matplotlib

Hur du installerar de olika biblioteken skiljer sig åt från system till system. Enklast är det under de stora Linux distributionerna så vi börjar med dessa. Hoppa över Python3 i stegen nedan ifall du redan har installerat det sedan tidigare.

Debian / Ubuntu / Mint

Ta fram en terminal och skriv följande kommandon som antingen root eller med hjälp av sudo. I Debian kan du oftast bli root genom att skriva su och skriva in root-lösenordet. Under Ubuntu och Mint skriver du sudo -i och anger ditt egna lösenord.

apt-get update
apt-get install python3 python3-matplotlib python3-pyside

Windows

Det enklast sättet att installera Python3 och Matplotlib under Windows är att använda den färdigpaketerade utgåvan Anaconda som innehåller både Python, Matplotlib, NumPy och en lång rad andra bra verktyg och bibliotek. Anaconda kan laddas ner från Anaconda.com. Det är ett grafiskt installationsprogram som installerar allting åt dig.

Om du använder Windows så kan du inte starta Pythonskripten med ./mitt-script.py så som man gör i t.ex. Linux. Istället kan man köra scripten genom att spara dem någonstans på hårddisken, t.ex. i Dokument-mappen och sedan starta IPython-tolkaren. Väl inne i IPython-tolkaren kan du köra scriptet genom att förflytta dig till rätt plats, t.ex. cd Documents och sedan skriva run mitt-script.py.

Några enkla diagram

Låt oss anta att vi har färdig data som vi vill representera med hjälp av olika grafer eller diagram. Som exempeldata kan vi ta befolkningen i några av Skånes största städer.

Stad Befolkning
Malmö 321 970
Helsingborg 137 556
Lund 116 682
Kristianstad 82 372
Ängelholm 40 655

Nu när vi har denna exempeldata kan vi enkelt skapa olika former av diagram och grafer. Vi börjar med ett enkelt pajdiagram. Spara koden i en fil, till exempel befolkning.py och gör den körbar med chmod +x befolkning.py om du använder Linux eller macOS.

ANNONS FÖR VÅRA EGNA BÖCKER Demonerna på internet

#!/usr/bin/env python3

# Vi börjar med att importera de bibliotek vi behöver samt specificera att 
# ska vi använda oss "Qt4Agg" (PySide) för att visa graferna.
import matplotlib
matplotlib.use("Qt4Agg")
import matplotlib.pyplot as plt

# Vår befolkningsdata
stader = 'Malmö', 'Helsingborg', 'Lund', 'Kristianstad', 'Ängelholm'
befolkning = [321970, 137556, 116682, 82372, 40655]
 
# Skapa diagramet
plt.pie(befolkning, labels=stader,
        autopct='%1.1f%%') # Noggrannheten i procent

# Sätt axlarna till lika, så att cirkeln verkligen blir rund 
plt.axis('equal')

# Och till sist, visa diagrammet
plt.show()

Om vi nu exekverar denna koden med med ./befolkning.py (eller med run befolkning.py inifrån IPython) får vi upp ett fönster på skärmen som visas här nedanför med ett pajdiagram. Härifrån kan vi spara vårt diagram i valfritt bildformat.

Pajdiagram över befolkningsmängd

Det var ju både enklare och snabbare än att starta upp Excel eller LibreOffice. Däremot kanske du inte tycker att diagrammet ser särskilt snyggt ut. Det går faktiskt att finjustera och anpassa utseendet på diagrammet precis så som vi vill ha det. Vi återanvänder samma kod som ovan men lägger till lite saker som gör att det hela blir lite snyggare.

#!/usr/bin/env python3

# Vi börjar med att importera de bibliotek vi behöver samt att vi ska
# använda oss "Qt4Agg" (PySide) för att visa graferna.
import matplotlib
matplotlib.use("Qt4Agg")
import matplotlib.pyplot as plt

# Vår befolkningsdata
stader = 'Malmö', 'Helsingborg', 'Lund', 'Kristianstad', 'Ängelholm'
befolkning = [321970, 137556, 116682, 82372, 40655]
farger = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral', 'olive']
explode = (0, 0, 0, 0, 0.07)  # 'dra ut' den sista tårtbiten

# Skapa diagramet
plt.pie(befolkning, labels=stader, colors=farger, explode=explode,
        shadow=True,
        autopct='%1.1f%%') # Noggrannheten i procent

# Sätt axlarna till lika, så att cirkeln verkligen blir rund 
plt.axis('equal')

# Och till sist, visa diagrammet
plt.show()

Om vi nu kör den nya koden igen med t.ex. ./befolkning.py så får vi ett vackrare diagram med lite mjukare färger, skuggeffekt och med den sista tårtbiten “utdragen” en bit från diagrammet. Bilden nedan visar det nya diagrammet sparat som en PNG-bild.

Nytt pajdiagram över befolkningsmängden

Andra typer av diagram

Men om vi istället vill skapa ett stapeldiagram, hur gör vi då? Detta är lika enkelt som när vi skapade vårt pajdiagram, det är dock några andra saker vi måste ange. Istället för procentsatser och axelns start måste vi nu istället tala om hur x och y axeln ska se ut.

Vi fortsätter med befolkningsexemplet och gör ett nytt program som ser ut som nedanstående kod. Spara koden och kör den med t.ex. ./befolkning_v2.py (eller run befolkning_v2.py inifrån IPython).

#!/usr/bin/env python3

# Vi börjar med att importera de bibliotek vi behöver samt att vi ska
# använda oss "Qt4Agg" (PySide) för att visa graferna.
import matplotlib
matplotlib.use("Qt4Agg")
import matplotlib.pyplot as plt

# Vår befolkningsdata, samma som tidigare
stader = 'Malmö', 'Helsingborg', 'Lund', 'Kristianstad', 'Ängelholm'
befolkning = [321970, 137556, 116682, 82372, 40655]

# Nu måste vi skapa en lista innehållande "0 1 2 3 4" som kommer att
# användas för x-axelns positioner & namn. Det skapar i princip en
# plats åt varje stapel. Det gör vi genom att köra range på längden
# listan med städerna.
x_pos = range(len(stader))

# Skapa diagramet. align="center" för att namnet ska hamna i mitten
# av stapeln. alpha=0.5 för att få en mjukare färgton/transparens,
# alltså alpha-channel.
plt.bar(x_pos, befolkning, align="center", alpha=0.5)
plt.xticks(x_pos, stader)
plt.ylabel("Befolkningsmängd")
plt.title("Befolkning i Skånska städer")

# Och till sist, visa diagrammet
plt.show()

Resultatet av detta program blir nedanstående stapeldiagram.

Stapeldiagram över befolkningsmängd

Om vi vill kan vi snabbt och enkelt ändra diagrammet till ett horisontellt stapeldiagram. Då ändrar vi bara plt.bar till plt.barh samt plt.xticks till plt.yticks (vi vrider ju axlarna nu). Resultatet av dessa två ändringar visas här nedanför.

Horisontellt stapeldiagram över befolkningsmängd