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 cycleMatplotlib-instillinger
Endrer standardinstillingene til Matplotlib. Gjør grafvinduet bredere og teksten større.
plt.rcParams['figure.figsize'] = 10, 5 plt.rcParams['font.size'] = 20figure.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.
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, .5Piler 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


