I alle nedenstående eksempler bruger jeg følgende linje
import matplotlib.pyplot as plt
Som i kan se kan rutinen fra nu af kaldes med plt.et-eller-andet
Matplotlib virkelig nem tutorial
Youtube matplotlib film om alle funktioner 32min så har du alt
Plotte en graf
plt.plot([1, 2, 3, 4], [1, 4, 7, 9], 'ro') # rød graf med x-akse(1234) og y-akse(1479)
plt.axis([0, 6, 0, 20]) # plotter x-aksen fra 0-6 og y-aksen fra 0-20
Plotte med forskellige symboler
'r--' betyder rød linje 'gs' betyder grønne firekanter
'bo' betyder blå cirkler 'y:' tegner en gul stiplede linje
'k^' betyder sorte trekanter
Plotte punkter på en graf
plt.scatter([1,3,5,7,9],[11.4,33.5,54E-9,-10.03,np.sin(4)])
plt.scatter(x,y,s=2) #punktstørrelsen instilles
Akser Titel og Legende
plt.xlabel('uafhængig variabel') # skriver aksetitlenplt.ylabel('afhængig variabel') plt.title('Naturvidenskabelig Måling') #skriver titlen på grafen som overskriftx = np.linspace(0,6,100)#genererer en liste med 100 punkter mellem 0 og 6
y = np.sin(x)*4 #beregner funktionen sin som den trækker fra numpy
plt.plot(x,y, '-r', label='Halloysa')
plt.legend(loc='upper right')#husk plt.legend skal komme EFTER plt.plot
plt.xlim(0, 0.01)#genererer x-aksen mellem 0 og 0.01
plt.ylim(0, 12) #genererer y-aksen mellem 0 og 12
Grid
plt.grid() # viser en grid
plt.grid(color='r', linestyle='--', linewidth=1) #viser en lidt sjovere grid
Plotte lodrette og vandrette linjer som positioneres individuelt.
Der er (v)hlines som er mere kompliceret og har flere funktionaliteter end ax(v)hline som bare tegner en linje.
plt.hlines(y=100,color='b',linestyle='--',lw=1,xmin=0, xmax=10)
plt.axhline(y=100/2,color='k',linestyle='--',lw=1)
plt.axvline(x=0,color='k',linestyle='--',lw=1)
plt.axvline(x=t_en_halv,color='k',linestyle='--',lw=1)
plt.vlines(x=[38, 38.25,38.5],ymin=[0,25,75],ymax=[200,175,150],colors='teal',ls='--',lw=2,label='vline_multiple - partial height')
Savefig gemmer en png fil med plottet den aktuelle mappe
plt.savefig('minsubplot.png')
plt.savefig('minsubplot.png',dpi=300) # hvis du vil have opløsningen højere i det gemte billede
Har du flere grafer i en men vil dele dem op skriv
plt.figure(1)
plt.figure(2)
før plt.plot(...) linjen
>>> xticks([]) # Disable xticks.
Python arbejder godt sammen med latex og bruger latex funktioner til at gøre funktionsudtryk flotte. Det er det lille "r" foran udtrykket som gør arbejdet.
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,6,100)
y = np.sin(x)*4
plt.plot(x,-y, 'g', label='1. plot')
plt.legend(loc='lower right')
plt.text(0.7,3, r'$\mu=100,\ \int_{-100}=\frac{x-4}{sin(x)}$')
plt.show()
I matematik vil man ofte gerne have aksen i midten. Det gøres på følgende måde
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-2*np.pi,2*np.pi,100)
y = np.sin(x)
mingraf = plt.figure()
ax =mingraf.add_subplot(111)
ax.spines['left'].set_position('center')
plt.plot(x,y)
Jeg har flyttet aksen i midten. Vil du fjerne den øverste og stregen til venstre skal du tilføje to linjer.
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
Læg også mærke til følgende linje
x = np.linspace(-2*np.pi,2*np.pi,100)
Vi genererer nu 100 punkter fra -2pi til 2pi.
plt.grid(True)
Og ovenstående linje generer et grid.
(111) (hvor mange plots under hinanden, hvor mange plots ved siden af hinanden, nr af det pågældende plot)
Subplot
Prøv at køre det her:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,6,100)
y = np.sin(x)*4
plt.subplot(131)
plt.plot(x,-y, 'g', label='1. plot')
plt.legend(loc='upper right')
plt.subplot(132)
plt.plot(x,2*y, 'b', label='2. plot')
plt.legend(loc='lower right')
plt.subplot(133)
plt.plot(x,y, 'k', label='3. plot')
plt.legend(loc='best')
plt.show()
To plots under hinanden kan man gøre med følgende
import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(0,6,200)
y1=np.sin(x)
y2=np.cos(x)
plt.subplot(211)
plt.plot(x,y1)
plt.title("Sinus og cosinus")
plt.subplot(212)
plt.plot(x,y2)
plt.savefig("subplot-sin-cos.png")
plt.show()
import numpy as np
import matplotlib.pyplot as plt
#generer data
x = np.linspace(0,1.75,1000)
fig,(sving1, sving2) = plt.subplots(2,1,figsize=(12,8))
fonts = 18
#figur 1
sving1.plot(x,np.sin(2*np.pi/1*x), label=r'Top til Top = bølgelængde $\lambda$ i m')
sving1.set_xlabel('lænde i m',fontsize=fonts,) # skriver aksetitlen
sving1.set_ylabel('Amplitude i m',fontsize=fonts)
sving1.grid(color='k', linestyle='-', linewidth=0.3)
sving1.legend(loc='lower left',fontsize=fonts-3)
#figur 2
sving2.plot(x,np.sin(2*np.pi/1*x),label='Top til Top = periode T i s')
sving2.set_xlabel('t i s',fontsize=fonts) # skriver aksetitlen
sving2.set_ylabel('Amplitude i m',fontsize=fonts)
sving2.grid(color='k', linestyle='-', linewidth=0.3)
sving2.legend(loc='lower left',fontsize=fonts-3)
# Adjust layout
plt.tight_layout()
# Show plot
plt.show()
Her til venstre er koden til et lidt mere avanceret måde til at plotte subfigurer på.
fig,(sving1,sving2) definerer de to subplots som man så kalder ved navn. Læg mærke til at xlabel og ylabel nu hedder set_xlabel og set_ylabel. Det er kommandoen pet.tight_layout som gør at x-label i den øverste plot er synlig.
np.linspace(0,6,100) genererer en array (liste) med 100 punkter mellem 0 og 6
x = np.linspace(0,6,100)
0 er starten på x-akse, 6 = slutplotx-akse, 100 er antal steps den beregner. Det er her den "genererer" punkterne på x-aksen.
"plt" er plotterutinen som kaldes med de forskellige attributter
Vi importerer numpy som "np" så kan man kalder alle de funktioner som "np" modulet kommer med np.sin(x)
r-- betyder rød farve og -- linje
k:: betyder blacK og punktlinje
Den nemmeste måde at lave akserne om på er på følgende måde:
np.min(tlist) henter den mindste af alle x-værdier som står i listen med navnen "tlist"
plt.xlabel("tid(s)")
plt.ylabel("antal henfald")
plt.axis([0, 200, 0.5 * np.min(tlist), 1.1 * np.max(tlist)])
plt.plot(tlist,nlist,linestyle='dotted',color='blue')
import matplotlib.pyplot as plt
import numpy as np
#definerer funktionerne
x = np.linspace(-2*np.pi,2*np.pi,100)
y = np.sin(x)
z = x**2 # x**2 betyder x^2
#flytte og styre akserne
mingraf = plt.figure()
ax =mingraf.add_subplot(111)
ax.spines['left'].set_position('center')
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
#styre længden af akserne
plt.xlim(-1,1)
plt.ylim(-1,1)
#styre ticks (unødvendigt her)
#plt.xticks([-1,0,1])
#plt.yticks([-1,0,1])
plt.grid(True)
plt.plot(x,y)
plt.plot(x,z)d
Dette er en simple plot af en lineær funktion
Klip koden ud og direkte ind i spyder. Den skulle producere et plot som vist her til højre.
import matplotlib.pyplot as plt
import numpy as np
a=2
b=10
x = np.linspace(-5,5,10)
y = a*x+b
minlegende=("y = {0} x + {1}".format(a,b))
plt.plot(x,y, '-r', label=minlegende)
plt.title('Lineær graf y = ax + b')
plt.xlabel('x', color='k')
plt.ylabel('y', color='k')
plt.legend(loc='upper left')
plt.grid()
plt.show()
Læg mærke til at den eneste matematik er linjen
y = ax+b
resten er plottefunktioner.
Der er mange måder at sætte farverne på den nemmeste er k for blacK, b for blå, r for rødt osv men selvfølgelig kan man sætte mange farver ind hvis man bruger de her hexadecimalkoder 1C2833 for rød fx.
værdierne er x_vaerdier er fra en liste. a,b,c kommer fra exponentiel regression.
plt.plot(x_plot, func(x_plot,a,b,c), 'r-',label=minlegende)
plt.scatter(x_vaerdier,y_vaerdier,label='datapunkter')
plt.title("x vs y = a*exp(-bx) +c")
plt.xlabel('x-værdier')
plt.ylabel('y-værdier')
plt.axhline(y=nlist[0],color='k',linestyle='--',lw=1)
plt.axhline(y=nlist[0]/2,color='k',linestyle='--',lw=1)
plt.axvline(x=0.9,color='k',linestyle='--',lw=1)
plt.axvline(x=12.2,color='k',linestyle='--',lw=1)
plt.grid(color='r', linestyle=':', linewidth=.4)
plt.text(len(values)/2, max(nlist)*0.7, "T1/2 = {0} s ".format(t_en_halv))
plt.text(len(values)/2, max(nlist)*0.6, "k = {0} s-1 ".format(b))
plt.legend()
plt.savefig("terningekast.png")
plt.show()
import numpy as np
import matplotlib.pyplot as plt
aargang = [2000,2005,2010,2015,2020]
vaerdi = [100,50,400,600,230]
plt.bar(aargang,vaerdi)