Plot af funktion med Python

Installation

For at kunne plotte funktioner og grafer, skal vi have tilføjet nogle ekstra pakker til Python

  • Numpy
  • Matplotlib

Opgradering af pip

Ekstra pakker installeres med pip, og det første vi gør er at opgradere pip

På Windows python -m pip install --user --upgrade pip På Mac python3 -m pip install --user --upgrade pip

Installation af pakker

Selve pakkerne installeres med nedestående kommandoer i en terminal:

På Windows python -m pip install --user numpy matplotlib På Mac python3 -m pip install --user numpy matplotlib

Anvendelse af pakker

Herefter kan pakkerne blive tilgået ved at importere det i starten af programmet. Når vi arbejder med plotning af funktioner skal vi importere begge

	
import numpy as np
import matplotlib.pyplot as plt
	

Læg mærke til at jeg fra start giver dem de to alias'er np og plt. De alias'er er valgt fordi det er dem der ofte bruges i diverse guides på nettet.

Mit første plot

Herunder plotter vi funktionen \( 2x-7 \). Efter koden bliver koden gennemgået mere konkret.

	
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-10,10,0.01)
plt.plot(x, 2*x-7)

plt.grid(True)

plt.title('$f(x) = 2x-7$')
plt.xlabel('x-akse (Definitionsmængde)')
plt.ylabel('y-akse (Værdimængde)')

plt.show()
	
_
_

Gennemgang af koden

	
import numpy as np
import matplotlib.pyplot as plt
	

Nødvendige pakker (dependencies)hentes

	
x = np.arange(-10,10,0.01)
plt.plot(x, 2*x-7)
	

I den første linie sættes definitionsmængden og opløsning (med hvor stor afstand værdierne skal beregnes). Her går det fra \( x = [ -10 ; 10 ] \), og der vil blive beregnet en værdi hver gang x-aksen stiger med \( 0,01 \).

Den anden linie laver selve plottet. Parantesen angiver først hvilken værdi på x-alsen den skal anvende og dernæst værdien på y-aksen (i dette tilfælde linien \( y = 2x-7 \)

.

Der beregnes punkter - her bliver hver x-værdi koblet på funktionsværdien.

	
plt.grid(True)
	

Plottet tegnes med et grid (tern).

	
plt.title('$f(x) = 2x-7$')
plt.xlabel('x-akse (Definitionsmængde)')
plt.ylabel('y-akse (Værdimængde)')
	

Sætter tekststrengen for henholdsvis plottets titel, x-akse og y-akse.

Læg mærke til $ der omkranser formlen i plt.title. Det får Python til at udskrive det med \( LaTeX \) formatering.

HUSK: Når du skal sætte tegnet \ skal du huske at "escape" det. \cdot bliver altså til \\cdot.

Læs mere om latex i pyplot: https://matplotlib.org/users/usetex.html

	
plt.show()
	

Funktionen der tegner plottet i et eksternt vindue.

Øvelser

Tegn følgende funktioner

$$ a) ~~~0,1 \cdot 0,65^x ~~for ~~ x=[ -1 ; 7 ]$$
Løsninger a)
_
$$ b)~~~\frac{ 1 }{ 2 } x^2 ~~for ~~ x=[ -5 ; 5 ]$$
Løsning b)
_
$$ c)~~-30x+4~~for~~x=[-5;0]~~ \wedge~~ 3x^2+4~~for ~~ x = [0;5] $$

TIP: Du skal lave to arange og plot - et for hver af intervallerne.

Løsning c)
_
$$ d)~~~\frac{ 1 }{ x } ~for~~x=[-1;1] $$

TIP: Da man ikke kan dividere med 0, skal du skille funktionen af i to intervaller [-∞;0] og [o;-∞].

Løsning d)
_

Indstillinger

Guides

https://matplotlib.org/users/pyplot_tutorial.html

Størrelse

	
plt.axis([-15, 15, -20, 20])
	

Farve

Farven sættes ved at tilføje parametren color="*farvenavn" eller blot c=*Farvenavn*. De tilgængelige farver er RGB + CMYK altså:

Grundfarver
r - rød g - grøn b - blå c - cyan
m - magenta y - gul k - key (sort) w - hvid

Alle farver kan dog anvendes. Se her: https://matplotlib.org/users/colors.html

Øvelse

Indtegn følgende tre funktioner i x = [-3;3]:

$$ 100x^2-400 ~~ (rød)$$
$$ 2 \cdot 0.2^x ~~(grøn) $$
$$ 100x+25 ~~(blå) $$
Løsning
_
_

Vandret/lodret linie

	
# Horisontal linie
plt.axhline(y=0, color="k")

# Lodret linie
plt.axvline(x=0)
	

Øvelse

Lav en graf med et kartesisk koordinatsystem.

Løsning
_
_

Punkter/tegn

Hvis man gerne vil markere punkter kan man gøre det på følgende måde. Herunder er der indsat 3 rækker af 5 forskellige punkter

	
import numpy as np
import matplotlib.pyplot as plt

plt.axis([-10,10,-10,10])

plt.plot(-8,4,"rv", markersize = 15)	#
plt.plot(-4,4,"r<", markersize = 15)	
plt.plot(0,4,"r>", markersize = 15)	
plt.plot(4,4,"r*", markersize = 15)	
plt.plot(8,4,"r.", markersize = 15)

plt.plot(-8,0,"go", markersize = 15)	
plt.plot(-4,0,"gx", markersize = 15)
plt.plot(0,0,"g^", markersize = 15)
plt.plot(4,0,"gs", markersize = 15)
plt.plot(8,0,"g+", markersize = 15)

plt.plot(-8,-4,"D", markersize = 15)	
plt.plot(-4,-4,"d", markersize = 15)
plt.plot(0,-4,"p", markersize = 15)
plt.plot(4,-4,"h", markersize = 15)
plt.plot(8,-4,"H", markersize = 15)

plt.title('Punkter')
plt.show()
	
_

Du kan finde en liste med forskellige muligheder her: https://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.plot

Forskellige linietyper

Hvis farver ikke er nok kan man også vælge at anvende linier der dannes af tegn. De simpleste at anvende er - - - - - - (streg streg streg ...) og - · - · - · (streg punktum streg punktum ...) da pyplot selv kan placere dem i korrekt afstand.

Farven sættes ligesom ovenfor ved punkter/tegn.

	
import numpy as np
import matplotlib.pyplot as plt

plt.axis([-10,10,-10,10])
x = np.arange(-10,10,0.01)

plt.plot(x, x,"r--")
plt.plot(x, -x,"g-.")
plt.plot(x,-pow(x,2)+4,"b--")

plt.grid(True)
plt.title('Linier med tegn 1')

plt.show()
	
_

Man kan også bruge alle tegnene ovenfra, men her skal man selv korrigere afstanden mellem punkterne (markeret med rødt)

	
import numpy as np
import matplotlib.pyplot as plt

plt.axis([-10,10,-10,10])
x = np.arange(-10,10,.5) ## Her sættes afstanden mellem hver enkelt tegn

plt.plot(x, x,"rh")
plt.plot(x, -x,"g+")
plt.plot(x,pow(x,2)-5,"bd")

plt.grid(True)
plt.title('Linier med tegn 2')

plt.show()
	
_

Søjle diagramm

	
import numpy as np
import matplotlib.pyplot as plt

kategorier = ["gruppe a", "gruppe b", "gruppe c", "gruppe d"]
værdier = [5, 24, 17, 12]

plt.bar(kategorier, værdier, width=0.8)
plt.title('Søjle diagram')
plt.show()
	
_
_

Læg mærke til at her bliver værdierne indsat ved hjælp af lister både for x og y's vedkommende.

Prik diagram

	
import numpy as np
import matplotlib.pyplot as plt

kategorier = ["gruppe a", "gruppe b", "gruppe c", "gruppe d"]
værdier = [5, 20, 17, 12]

plt.plot(kategorier, værdier, "ro", markersize=5)
plt.title('Prik diagram')
plt.show()
	
_
_

Cirkeldiagrammer

https://matplotlib.org/api/_as_gen/matplotlib.pyplot.pie.html

Tekst ved plots

https://stackoverflow.com/questions/42435446/how-to-put-text-outside-python-plots

https://stackoverflow.com/questions/332289/how-do-you-change-the-size-of-figures-drawn-with-matplotlib

https://matplotlib.org/api/_as_gen/matplotlib.pyplot.subplot.html

Supplots

https://matplotlib.org/tutorials/intermediate/gridspec.html