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