Afsnit Py.2: Figurer i python

Når man skal lave figurer i python, skal man bruge modulet matplotlib.pyplot: import matplotlib.pyplot as plt. Den grundliggende funktion til at lave en figur i er plt.plot. Når man er færdig med kommandoerne til figuren, skal man afslutte med plt.show(), for at figuren bliver vist.
Hvis der både laves en figur og efterfølgende beregninger, skal plt.show() komme efter beregninger, for at disse bliver vist. Hvis man ønsker at lave flere figurer i det samme program, kan man starte figur 1 med plot1=plt.figure(1), figur 2 med plot2=plt.figure(2), og så videre, og afslutte programmet med plt.show()
Input til plot er to vektorer af samme længde, for eksempel og Uden andre argumenter vil plt.plot(x,y) lave en kurve, der forbinder punkterne hvor er længden af vektorerne. En mere generel version er
plt.plot(x,y,'abc')
hvor siger noget om linjen, der forbinder punkterne, siger noget om det symbol, der bruges til at markere punkterne, og siger noget om farven. Udelades , fås en figur, hvor punkterne ikke er forbundet med linjestykker. Mulighederne for linjetypen () er
De vigtigste punktmarkører er
Farvemulighederne er
Hvis der angives en punktmarkør, men ikke en linjetype, markeres punkterne uden at blive forbundet af linjestykker. Nedenfor vises nogle eksempler på figurer. De tre figurer, der laves nedenfor, er sat sammen og vist i den efterfølgende figur.

import numpy as np
import matplotlib.pyplot as plt

x=np.array([2,3,1,4,5])

y=x**2

plt.plot(x,y)  # her kommer et nyt vindue med figuren
plt.show()

plt.figure() # start en ny figur i stedet for at tegne oveni bestående
plt.plot(x,y,'o')
plt.show()

xs=np.sort(x)  # x sorteret i stigende orden
print(xs)
| [1 2 3 4 5]


xI=np.argsort(x)  # index af værdierne i xs i den oprindelige x
print(xI)
| [2 0 1 3 4]

plt.figure()
plt.plot(xs,y[xI],'-or')
plt.show()

Man kan sætte titler på akserne og hele figuren ved hjælp af xlabel('titel'), ylabel('titel') og title('titel'). Endvidere kan man selv styre startværdi og slutværdi på første- og andenaksen ved hjælp af xlim([]) og ylim([]). Følgende figur er sat ind som det nederste højre hjørne i den efterfølgende figur. Bemærk, at I nedenfor ser et eksempel, hvor en kommando deles over flere linjer.

import numpy as np
import matplotlib.pyplot as plt

a=np.array([0.032,0.034,0.214,0.263,0.275,0.275,0.450,0.500,\
0.500,0.630,0.800,0.900,0.900,0.900,0.900,1.000,\
1.100,1.100,1.400,1.700,2.000,2.000,2.000,2.000])

h=np.array([170,290,-130,-70,-185,-220,200,290,270,200,300,\
-30,650,150,500,920,450,500,500,960,500,850,800,1090])

plt.plot(a,h,'o')
plt.xlabel('Afstand')
plt.ylabel('Hastighed')
plt.title('Hubbles Lov')
plt.xlim([-1,3])
plt.ylim([-500,1500])
plt.show()

Py.2.1 Flere plotkommandoer i samme vindue

En ny plotkommando vil blive udført i den samme figur som den eksisterende, medmindre man har afsluttet figuren med plt.show(). Prøv selv at køre nedenstående kommandoer.

Py.2.2 Opdeling af plotvindue

Man kan dele et plotvindue op, således at der kan være flere delfigurer indenfor vinduet. Dette gøres ved hjælp af plt.subplot efter importeringen import matplotlib.pyplot as plt. Funktionen har tre argumenter, hvor de to første angiver antal rækker og antal søjler, som figuren deles op i, og det tredje argument angiver nummeret på subplot, hvor der tælles rækkevis. Figuren ovenfor er fremkommet ved at bruge plt.subplot(2,2,j), .
Eksemplet nedenfor viser hvordan plt.subplot kan bruges. Kommandoen plt.tightlayout() sørger for at der er plads til titler på akserne. I eksemplet er vist, hvordan en delfigur kan fylde to undervinduer. Figuren, der produceres i eksemplet, er vist længere nede.

import numpy as np
import matplotlib.pyplot as plt
from pytFunktioner import *

a=np.array([0.032,0.034,0.214,0.263,0.275,0.275,0.450,0.500,\
0.500,0.630,0.800,0.900,0.900,0.900,0.900,1.000,\
1.100,1.100,1.400,1.700,2.000,2.000,2.000,2.000])

h=np.array([170,290,-130,-70,-185,-220,200,290,270,200,300,\
-30,650,150,500,920,450,500,500,960,500,850,800,1090])

ax1 = plt.subplot(2, 2, 1)
ax2 = plt.subplot(2, 2, 2)
ax3 = plt.subplot(2, 2, (3, 4))

ax1.plot(a,h)
ax1.set_title('Data')
ax2.plot(a,h,'o')
refline(454.1580,-40.7833,ax=ax2)
ax2.set_xlabel('Afstand')
ax2.set_ylabel('Hastighed')
ax2.set_title('Regression')
r=h-(-40.7833+454.1580*a)
ax3.plot(a,r,'o')
ax3.axhline(0)
ax3.set_title('Residualer')
plt.tight_layout()
plt.show()

Bemærk i ovenstående brugen af refline og axhline, der beskrives nedenfor.

Py.2.3 Gemme figur

Når en figur er lavet i python og bliver vist i plotvinduet, kan man gemme denne med kommandoen
plt.savefig(fname="navn.png")
Hvis man ønsker figuren i et andet format skifter man endelsen "png" ud. Man kan også blot bruge "gemme"-knappen i plotvinduet.

Py.2.4 Refline og errorbar

I ovenstående figur blev der i øverste højre delfigur indsat en generel linje, og i nederste delfigur en nullinje. Python har en funktion axline, der kan bruges til dette, men jeg har lavet en alternativ funktion refline der er mere simpel at bruge. I de fleste tilfælde vil kaldet til refline blot være på formen
refline(h,s)
som indsætter en linje, der skærer andenaksen i og har hældning . Linjetypen kan justeres ved at tilføje linestyle='d', og farven ved at tilføje color='e', hvor mulighederne er som angivet for plot i starten af dette afsnit. Hvis man bygger en figur op bestående af flere delfigurer, er det nødvendigt at angive eksplicit, hvilken delfigur linjen skal indsættes i. Dette gøres ved tilføjelsen ax=axj hvor axj peger på delfiguren (se kodeeksemplet ovenfor). En vandret linje, der skærer andenaksen i , kan indsættes med kommandoen plt.axhline(s), og en lodret linje, der skærer førsteaksen i , kan indsættes med kommadoen plt.axvline(v). Nullinjen kan således indsættes med kommandoen plt.axhline(0), og identitetslinjen kan indsættes med kommandoen refline(1,0), altså linjen der går gennem og har hældning 1.
Ofte vil man i en figur vise usikkerheden på en måling eller et konfidensinterval for et parameterskøn i form af et lodret linjestykke med en ``kant'' i hver ende. Dette kan gøres nemt med kommandoen errorbar. Denne indsætter et lodret linjestykke fra en angivet afstand under punktet til en angivet afstand over punktet. Funktionen kan bruges som følger
errorbar(x,y,yerr=[[distned],[distup]],fmt='o')
hvor og er to vektorer med en række punkter, distNed er en vektor, der angiver, hvor langt under punktet det lodrette linjestykke skal starte, og distOp er en vektor, der angiver, hvor langt over punktet det lodrette linjestykke skal slutte. For modifikation af linjetype, der forbinder punkterne og symbol for punkt (specificeret under fmt), henvises til beskrivelsen af plot i starten af dette afsnit.
ForegåendeNæste