Fine, rette linjer med Matplotlib
Jeg holder på å skrive om likningen til en rett linje. I den forbindelse har jeg laget noen enkle figurer i Matplotlib som illustrerer likningen, stigningstallet og konstantleddet. Jeg viser blant annet hvordan vi kan få navn og piler på aksene.
Disse tegningene ble brukt til å illustrere Skrive matematikk med LaTeX
Innhold
- Oppsett
- Piler og navn på aksene
- Tegne rett linje
- Ettpunktsformel
- Likning
- Stigningstall
Oppsett
Funksjoner og biblioteker
Laster inn biblioteker og funksjoner jeg har tenkt å bruke.
import matplotlib.pyplot as plt
import numpy as np
from itertools import cycle
Matplotlib-instillinger
Endrer standardinstillingene til Matplotlib. Gjør grafvinduet bredere og teksten større.
plt.rcParams['figure.figsize'] = 10, 5
plt.rcParams['font.size'] = 20
figure.figsize er bredde, høyde i tommer. Siden oppløsningen er 72 dpi (punkter per tommer) blir bredden 720 piksler. Denne størrelsen passer bra med bredden på WordPress-temaet mitt.
Fargesykel
Siden jeg skal tegne flere figurer vil jeg at hver figur skal få sin egen farge. Jeg lager meg et cycle-objekt. Hver gang jeg kaller next-funksjonen med denne som argument vil jeg få en ny farge. Når listen er tom begynner den på starten igjen.
farger = cycle(['tab:blue', 'tab:orange', 'tab:green',
'tab:red', 'tab:purple', 'tab:brown',
'tab:pink', 'tab:olive', 'tab:cyan'])
Tegneparametre
Setter parametre som skal være felles for alle grafene. Dette er stigningstall, konstantledd, $x$-verdiene vi skal tegne linjen fra og til og til slutt hvor vi vil markere $x_1$
a0, b0, xstart0, xslutt0, x1_0 = 0.5, 0.5, -.5, 2.5, .5
Piler og navn på aksene
Lager en funksjon som setter opp aksene med piler og navn i det eksisterende tegnevinduet.
def tegnevindu():
"""
Funksjon som setter opp et tegnevindu med piler og navn på aksene.
Returns
-------
ax : matplotlib.axes.Axes
Det ferdige akseobjektet
"""
# Henter ut det eksisterende akseobjektet.
ax = plt.gca()
# Flytter venstre- og nedreaksen til henholdsvis x = 0 og y = 0.
ax.spines["left"].set_position("zero")
ax.spines["bottom"].set_position("zero")
# Skjuler høyre- og toppaksen
ax.spines["top"].set_visible(False)
ax.spines["right"].set_visible(False)
# Tegner piler som svarte trekanter: ">k" på slutten av aksene.
# Koordinatene sammen med transform-argumentet gjør at trekantene alltid
# kommer på enden av aksene.
ax.plot(1, 0, ">k", transform=ax.get_yaxis_transform(), clip_on=False)
ax.plot(0, 1, "^k", transform=ax.get_xaxis_transform(), clip_on=False)
# Gir navn på aksene og flytter aksenavnene til enden av aksen.
ax.set_xlabel("x", loc="right")
ax.set_ylabel("y", loc="top")
# Fjerner aksemerkene
ax.set_xticks([])
ax.set_yticks([])
# Returnerer akseobjektet.
return ax
ax = tegnevindu()
plt.show()
gca henter ut det eksisterende akseobjektet som pyplot bruker eller oppretter et nytt akseobjekt i pyplot dersom det ikke finnes.
Dette gjør at
ax = plt.gca()
ax.plot([1, 2, 3], [1, 3, 2])
Tilsvarer
plt.plot([1, 2, 3], [1, 3, 2])
Tegne-metodene til akseobjektet er de samme eller nesten de samme som tegne-funksjonene til pyplot. Ofte er forskjellen at metodene starter med set_ eller get_. For eksempel bruker pyplot xlabel-funksjonen til å sette navn på x-aksen, mens akseobjektet bruker set_xlabel-metoden til å gjøre det samme.
Tegne rett linje
Lager en funksjon som tegner en rett linje.
def tegn_linje(a=a0, b=b0, xstart=xstart0, xslutt=xslutt0):
# Henter ut en ny farge
farge = next(farger)
# Setter opp tegnevinduet
ax = tegnevindu()
# Lager en funksjon for å finne y-verdiene til den rette linjen.
def f(x):
return a*x + b
# Lager en liste med x-verdier
xverdier = np.linspace(xstart, xslutt)
# Tegner den rette linjen gitt ved y = ax + b i akseobjektet.
ax.plot(xverdier, f(xverdier), color=farge)
# Gir x- og y-aksen de samme proporsjonene
ax.axis('scaled')
# Returnerer akseobjektet sammen med funksjonen vi laget for y.
# Dette gjør at vi ikke trenger å lage en ny funksjon når vi skal
# jobbe videre med grafen.
return ax, f
tegn_linje()
plt.show()
Ettpunktsformel
Lager en funksjon som markerer punktet $(x1, y1)$ på den rette linjen som et punkt med tekst.
def tegn_ettpunktsformel(a = a0, b=b0, xstart = xstart0, xslutt=xslutt0, x1=x1_0):
# Tegner den rette linjen
ax, f = tegn_linje(a, b, xstart, xslutt)
# Regner ut den tilsvarende y-verdien
y1 = f(x1)
# Markerer punktet (x1, y2)
ax.scatter(x1, y1, color="black")
ax.text(x1, y1, r"$(x_1, y_1)$", ha="right", va="bottom")
# Returnerer akseobjektet
return ax
ax = tegn_ettpunktsformel()
plt.show()
Likning
Lager en funksjon som markerer konstantleddet, $b$, på $y$-aksen og stigningstallet, $a$, som en trekant mellom $x_1$ og $x_1 + 1$ med høyde $a$.
def tegn_likning(a=a0, b=b0, xstart=xstart0, xslutt=xslutt0, x1=x1_0):
# Tegner den rette linjen.
ax, f = tegn_linje(a, b, xstart, xslutt)
# Regner ut x2, y1, og y2
x2 = x1 + 1
y1, y2 = f(x1), f(x2)
# Tegner trekanten.
ax.plot([x1, x2, x2], [y1, y1, y2], color="black")
# Markerer den rette vinkelen i (x2, y1).
ax.plot([x2, x2 - 0.1, x2 - 0.1], [y1 + 0.1, y1 + 0.1, y1], color="black")
# Setter tall på grunnlinjen og gir navn på høyden.
ax.text((x1 + x2)/2, y1, 1, va="top")
ax.text(x2, (y1 + y2)/2, "a", ha="left")
# Markerer lengden b og setter navn
ax.plot([0, 0], [0, b], color="black")
ax.text(0, b/2, "b", va="center", ha="right")
# Returnerer akseobjektet
return ax
ax = tegn_likning()
plt.show()
Stigningstall
Lager en funksjon som markerer $(x_1, y_1)$ og $(x_2, y_2)$ og viser $\Delta x$ og $\Delta y$ som katetene i en rettvinklet trekant.
def tegn_stigningstall(a=a0, b=b0, xstart=xstart0, xslutt=xslutt0, x1=x1_0):
# Tegner den rette linjen.
ax, f = tegn_linje(a, b, xstart, xslutt)
# Regner ut x2, y1, og y2
x2 = x1 + 1
y1, y2 = f(x1), f(x2)
# Markerer (x1, y1) og (x2, y2)
ax.scatter([x1, x2], [y1, y2], color="black")
# Tegner trekanten.
ax.plot([x1, x2, x2], [y1, y1, y2], color="black")
# Markerer den rette vinkelen i (x2, y1).
ax.plot([x2, x2 - 0.1, x2 - 0.1], [y1 + 0.1, y1 + 0.1, y1], color="black")
# Markerer (x1, y1) og (x2, y2)
ax.text(x1, y1, r"$(x_1, y_1)$", ha="right", va="bottom")
ax.text(x2, y2, r"$(x_2, y_2)$", ha="right", va="bottom")
# Markerer katetene i trekanten
ax.text((x1 + x2)/2, y1, r"$\Delta x = x_2 - x_1$", va="top", ha="center")
ax.text(x2, (y1 + y2)/2, r"$\Delta y = y_2 - y_1$", ha="left")
# Returnerer akseobjektet
return ax
ax = tegn_stigningstall()
plt.show()
#akse #aksepil #aksetittel #Axes #cycle #ettpunktsformel #gca #itertools #konstantledd #matplotlib #numpy #plot #rettLinje #stigningstall #trekant