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