4.2. Matplotlib#

Vi vil ofte i lab gerne formidle vores data i form af en figur. For at lave figurer bruger vi pakken Matplotlib.

Matplotlib er et kæmpe bibliotek og kan rigtig rigtig meget. Det er faktisk så stort at du kun skal bruge en lille del af det pyplot. Derfor skriver man matplotlib.pyplot, det svarer lidt til kun at læse bøgerne i fysikafdelingen af et bibliotek.

Man skal også passe på, når man laver plots med matplotlib. Det mixer dårligt med Sympy, da matplotlib laver plots ud fra tal og ikke analytiske udtryk, som er det Sympy giver. Hvis man skal lave et plot med Sympy så kig i noten om Sympy.

4.2.1. Plots#

For at lave et plot skal vi først have data at arbejde med.

import numpy as np
xData = np.array([1,2,3,4])
yData = np.array([1,1.8,3.3,3.7])

Når man laver et plot med Matplotlib bygger man det op trinvis. Først laves plottet ud af data med plt.plot. Derefter bygges aksenavne og en legend på. Et eksempel ses her,

import matplotlib.pyplot as plt

plt.plot(xData, yData, 'o', label = "Data") #Vi plotter xData mod yData som store prikker, og giver datasættet en titel

plt.xlabel('Længde [cm]', fontsize = 20) #Tilføjer etiketter på akserne og angiver skriftstørrelse
plt.ylabel('Masse [g]', fontsize = 20)

plt.legend(fontsize = 13) #plotter en "legend", navnet hentes fra label i plt.plot

plt.savefig("figure.png") #gemmer figuren som en .png fil

plt.show() #viser figuren under den kørte celle
../../_images/Matplotlib_pyplot_4_0.png

I behøver ikke nødvendigvis manuelt indstille skriftstørrelsen på akser og legend hver gang, men det kan nogle gange være nødvendigt at justere, afhængig af hvor meget figurerne skal fylde i jeres logbog. Regelen er at man altid skal kunne læse akse-titlerne uden at zoome ind eller hive forstørrelsesglas frem. Vær også opmærksom på, at når I bruger funktionen plt.savefig(), gemmes jeres figur i samme mappe som jeres Notebook ligger, medmindre I indstiller det anderledes.

Det kan også være smart at ændre hvad der er på akserne, et eksempel med radianer ses under. Der er også blevet sat errorbars på data. Det gøres ved at plotte med plt.errorbar i stedet for plt.plot.

#flere eksempler på at plotte

xVærdi = np.linspace(0,2*np.pi,100) #laver et array af værdierne fra 0 til pi, fordelt over 100 datapunkter

#bruger NumPy funktioner til at plotte sinus og cosinus til vores x værdier, og indikerer at punkter skal være en 
#prikket linje

yerr = np.random.uniform(0.01,0.1,(100,1))
plt.errorbar(xVærdi, np.sin(xVærdi), yerr, fmt = ':', label = "f(x) = sin(x)")
plt.errorbar(xVærdi, np.cos(xVærdi), yerr, fmt = ':', label = "f(x) = cos(x)")

plt.xlabel('x') #sætter titler på akserne
plt.ylabel('f(x)')

# Følgende skridt er lidt unødvendigt, men plotter man ex. trigonometriske funktioner kan det være fedt at indstille
# aksen så værdierne "giver mening" ift. funktionen.
# Her indikerer første array hvor på x-aksen man vil have "ticks", og dernæst et array med hvad der skal stå på hvert
# "tick"
plt.xticks([0,np.pi/2,np.pi,3*np.pi/2,2*np.pi], ['0','$\pi/2$','$\pi$','$3/2\pi$','$2\pi$'])

plt.legend()

plt.show()
<ipython-input-9-d5d355b23b32>:9: MatplotlibDeprecationWarning: Support for passing a (n, 1)-shaped error array to errorbar() is deprecated since Matplotlib 3.1 and will be removed in 3.3; pass a 1D array instead.
  plt.errorbar(xVærdi, np.sin(xVærdi), yerr, fmt = ':', label = "f(x) = sin(x)")
<ipython-input-9-d5d355b23b32>:10: MatplotlibDeprecationWarning: Support for passing a (n, 1)-shaped error array to errorbar() is deprecated since Matplotlib 3.1 and will be removed in 3.3; pass a 1D array instead.
  plt.errorbar(xVærdi, np.cos(xVærdi), yerr, fmt = ':', label = "f(x) = cos(x)")
../../_images/Matplotlib_pyplot_6_1.png

Dette er sådan vi forventer at jeres plots ser ud nå i aflevere dem i laboratoriet.

Der er en masse forskelige andre ting man kan med at plotte men dette bør være nok til det I skal her.