VIÐAUKI A: Teikning tvívíðra falla í Python¶
A1. Hæðarlínu- og hæðarsvæðamyndir¶
Hæðarlínur með skipuninni contour
Aftast í kafla 1.3 var gefið dæmi um teikningu
hæðarlína falls með fallinu plt.contour
, þar sem flestir stýristikar höfðu
sjálfgefni gildi. Dæmi sýndi þó hvernig hægt er að tilgreina litaskala og
línubreidd: Litaskali sem heitir rainbow var valinn og ennfremur þriggja
punkta línubreidd (1 punktur = 1/72 tomma \(\approx\) 3.5 mm). Hér verða
nokkrir fleiri stýrimöguleikar kynntir, en fyrst skoðað hvað stikarnir x, y
og z geyma og hvað fallið dularfulla np.meshgrid
gerir.
Skipunin plt.contour(x, y, z)
teiknar hæðarlínur fyrir yfirborð sem lýsir
tvívíðu falli \(f\) þar sem
Hér eru x
og y
vigrar með gildum sem spanna svæðið sem teikningin nær
yfir (t.d. úr np.linspace
) og z
er fylki með gildum \(f\) á svæðinu.
Hér hefur stærðfræðilegur ritháttur verið notaður fyrir fylkið og vigrana. Til
að gefa z gildi í Python mætti nota:
(nx,ny) = (len(x), len(y))
z = np.zeros((ny,nx))
for j in range(ny):
for i in range(nx):
z[j,i] = f(x[i], y[j])
Ástæða þess að vísað er í \(z_{ji}\) en ekki \(z_{ij}\) er sú að hefðin býður að vísa í dálka fylkis (sem ganga frá vinstri til hægri) á eftir línum þess (\(z_{ji}\) er í \(j\)-tu línu og \(i\)-ta dálki), en í tvívíðu hnitakerfi kemur \(x\)-hnit (líka frá vinstri til hægri) á undan \(y\)-hniti.
Í staðinn fyrir for
-lykkjur má líka nota comprehension.
z = [[f(xi,yj) for xi in x] for yj in y]
Þetta er bæði einfaldari kóði, og auk þess sleppur maður við að nota þessa
svolítið ruglingslegu röð: j,i
. Svo er enn einfaldari leið að skrifa:
(X,Y) = meshgrid(x,y)
Z = f(X,Y)
og í framhaldi plt.contour(X, Y, Z)
. Til að það virki þarf að gæta þess að
forrita fallið f
þannig að það geti tekið við vigur-viðföngum, sér í lagi
þarf að nota NumPy útgáfur af stærðfræðiföllum sbr. kafla 10.3 í Fyrirlestrarnótum
um Python.
Stilling á útliti hæðarlínumynda
plt.contour(x, y, z, stiki=gildi,...)
teiknar hæðarlínur og setur ýmsa
stillingarstika. Helstu stikar eru:
levels
tala með fjölda hæðarlína sem teiknaðar eru, eða vigur með gildum fallsins sem hæðarlínurnar eru teiknaðar fyrir.
colors
litir hæðarlínanna (vigur, t.d. [‚r‘, ‚g‘, ‚b‘] til að lita línurnar rauða, græna, bláa, rauða, græna, bláa,…) eða litur.
linewidths
línubreiddir eða línubreidd
cmap
tilgreinir litaskala (colormap) til að nota; sjá kafla xxx
c = plt.contour(...)
og plt.clabel(c, fmt="%.0f")
merkir hverja
hæðarlínu með gildi fallsins á henni. Líka má merkja t.d. aðeins neðstu 5
línurnar með plt.clabel(c, c.levels[:5])
Auk þess að nota stillingarviðföng í kalli á contour
er hægt að stilla stærð
myndar, bæta við titli, merkingum á ása o.fl. með ýmsum Matplotlib- skipunum sem
lýst er í 9. kafla
í Fyrirlestrarnótum um Python.
Sýnidæmi: Hæðarlínur falls
Eftirfarandi forrit teiknar hæðarlínur fallsins \(f(x,y) = x^2 + 4y^2\) á
rétthyrningnum \([-3,3] \times [-2,2]\). Takið eftir hvernig snið merkinga í
clabel
er stillt með fmt
-stika og einnig skrefin á merkingum y-áss með
plt.yticks
.
def f(x,y): return x**2 + 4*y**2 plt.figure(figsize=(6,3)) x = np.linspace(-4,4,100) y = np.linspace(-2,2,50) z = np.array([[f(xi,yj) for xi in x] for yj in y]) c = plt.contour(x, y, z, 8, colors = 'brown') plt.clabel(c, fmt="%.0f"); plt.yticks(np.arange(-2, 3)) plt.axhline(c='k') plt.axvline(c='k');

Mynd 1: Kvaðratískt fall með lággildi í (0,0)¶
Hæðarsvæði með skipuninni contourf
plt.contourf(x, y, z, stiki=gildi…) teiknar tvívítt fall með því að lita
svæði eftir gildi þess. Svæði sem eru á milli tveggja samliggjandi hæðarlína sem
plt.contour
mundi teikna litast með sama lit og contour
mundi lita neðri
línuna með. Stikarnir x, y, z
eru eins og lýst er fyrir contour
, og
stillingarstikarnir levels
og colors
sömuleiðis. Hinsvegar er enginn
linewidths
stiki og ekki hægt að nota clabel
. Til að fá bæði lituð svæði
og teiknaðar línur á milli þeirra má kalla fyrst á contourf
og svo
contour
með sömu stika.
Þessi mynd fæst með contourf
í forriti sem er svipað og
Forrit 1:

Mynd 2: Hæðarsvæðamynd¶
Hægt er að fá myndir þar sem litirnir breytast samfellt (ekki ósvipað og í
heimskortinu hér að framan) með því nota hátt gildi á levels
stika, t.d.
á bilinu 100–200.
A2. Fjarvíddarmyndir¶
Netmyndir með plot_surface
Til að teikna netmyndir þarf smá undirbúning: Í fyrsta lagi þarf að flytja inn
klasann (class) Axes3D í einingunni mpl_toolkits.mplot3d
með skipuninni:
from mpl_toolkits.mplot3d import Axes3D
,
í öðru lagi þarf að búa til fylki X
og Y
sem spanna teiknisvæðið
með skipuninni
(X,Y) = np.meshgrid(x,y)
þar sem x
og y
eru vigrar eins og í kafla A1 og í þriðja lagi þarf að
smíða sérstaklega þrívítt hnitakerfi (ása; axes) til að teikna í, með
skipuninni:
ax = plt.subplot(projection = '3d')
Teikniskipunin plot_surface
sem teiknar sjálfa netmyndina er svo aðferð
(method) í ásunum ax
þannig að það er kallað á hana með
ax.plot_surface
. Þetta er sýnt er í eftirfarandi dæmi, sem teiknar fallið
sem gefið er aftast í kafla 1.3. Takið eftir að
eins og þegar einvíð föll voru teiknuð þarf að nota np-útgáfur af innbyggðu
föllunum, sem sé np.sqrt en ekki math.sqrt, til að fallsgildi allra staka í
vigrum reiknist í einu lagi.
def f(x,y): r = np.sqrt(x**2 + y**2) return (1 + 4*np.sin(r))/(1 + 4*r) x = y = np.linspace(-10,10,30) Z = np.array([[f(xi,yj) for xi in x] for yj in y]) (X,Y) = np.meshgrid(x, y) plt.figure(figsize=(12,5)) ax = plt.subplot(projection='3d') ax.plot_surface(X, Y, Z, edgecolor='k', shade=False, color='w');

Mynd 3: Matplotlib netmynd¶
Athugið
Tæknilega eru ásarnir ax
hlutur (object) af klasatagi (class type)
Axes3DSubplot
, eða með öðrum orðum eintak af taginu Axes3DSubplot
,
sem er klasi sem erfist frá klasanum Axes3D
sem aftur erfist frá
Axes
. Þegar klasi er fluttur inn eru skipanir í honum framkvæmdar og því
getur innflutningur á klösum haft ýmsar hliðarverkanir. Að flytja inn klasann
Axes3d
hefur þá hliðarverkun að plt.subplot ræður við að smíða þrívíða
ása.
Upplýstar myndir með plot_surface
Skipunin sem notuð er til að teikna netmyndir, plot_surface
nýtist líka til
að teikna upplýstar myndir. Eftirfarandi mynd fæst með forriti sem er eins og
Forrit 2 fyrir utan að aftasti stikinn sem linspace fær er
100 og síðustu línunni er skipt út með:
ax.plot_surface(X,Y,Z,color='wheat',rcount=100,ccount=100,antialiased=False)

Mynd 4: Upplýst hattfall¶
A3. Teikning stigla¶
Eins og nefnt var aftast í kafla 1.6 má teikna stigla með fallinu
quiver
.
Sýnidæmi: Teikning stigla
Forritið hér að neða teiknar hæðarlínur fallsins
sem teiknað var í kafla A1, og jafnframt stigla þess í sérhverjum punkti í rétthyrndu neti.
def f(x,y):
return x**2 + 4*y**2
def fx(x,y):
return 2*x
def fy(x,y):
return 8*y
X = np.linspace(-4,4,50)
Y = np.linspace(-2,2,25)
X3 = X[::3]
Y3 = Y[::3]
z = np.array([[f(x,y) for x in X]
for y in Y])
u = np.array([[fx(x,y) for x in X3]
for y in Y3])
v = np.array([[fy(x,y) for x in X3]
for y in Y3])
c = plt.contour(X, Y, z, 12)
ax = plt.gca()
ax.set(aspect = 'equal',
yticks = np.arange(-2,3,1))
plt.clabel(c, fmt="%.0f");
plt.quiver(X3, Y3, u, v);
Athugið
Til að skoða lista yfir alla eiginleika (properties) sem hægt
er að stilla með ax.set
má gefa skipunina plt.getp(ax)
Æfing
Reiknið (á blaði) stigul falls Rosenbrocks
\[f(x_0, x_1) = (1 - x_0)^2 + 100(x_1 - x_0^2)^2\]Reiknið í framhaldi \(\nabla f(-1,1)\), \(\nabla f(0,1)\) og \(\nabla f(1,1)\). Athugið hvort niðurstöðurnar rími við eftirfarandi hæðarlínumynd af fallinu, t.d. með því að rissa upp á blaðið stiglana þrjá og hæðarlínur í grennd við þá (styttið þá samt svo þeir komist fyrir á blaðinu..

Mynd 5: Fall Rosenbrocks¶
A4. Litaskalar¶
Litaskalar (colormaps) í tölvugrafík eru ýmist notaðir til að sýna gildi á samfelldum breytum (föllum) eða á flokkunarbreytum sem geta tekið eitt af nokkrum gildum (oftast innan við tíu). Myndirnar sem um ræðir eru oft hæðarlitamyndir, en geta líka verið af annarri gerð, t.d. línurit, punktariti eða súluriti.
Matplotlib hjálpin geymir yfirlit yfir innbyggða litaskala og myndir af þeim. Hjálpin flokkar litaskalana í nokkra yfir- og undirflokka. Yfirflokkarnir eru:
sequential
diverging
cyclic
qualitative
Fyrstu þrír flokkarnir eru fyrir samfelldar breytur en sá síðasti (eigindlegir skalar) fyrir flokkunarbreytur. Diverging skalar gætu e.t.v. hentað til að sýna föll með tiltekinn núllpunkt (frost og hita), og þriðji flokkurinn fyrir lotubundin föll. Auk fyrrnefndra fjögurra flokka er í hjálpinni flokkur með yfirskrift miscellaneous og þar á meðal eru nokkrir skalar sem henta fyrir samfelldar breytur og þeir eru settir í flokk með runuskölunum (sequential) hér.
Skipanir sem nota litaskala
Hægt er að tilgreina colormap með þeim skipunum sem geta litað gögn eftir tölugildi. Meðal þessara skipana eru:
plt.scatter
plt.contour
plt.contourf
plt.quiver
plot_surface
Allar þessar skipanir eru með valkvæðan stika, cmap
sem hefur gildi sem má
vera strengur með nafni litaskala eða hlutur af taginu colormap, og stýrir því
að gögnin litist með uppgefnum skala.
Samfelldir skalar
Sjálfgefni skalinn í Matplotlib kallast ‚viridis‘ og hér er mynd af honum:

Mynd 6: Viridis litaskalinn¶
Skalinn byrjar með dökkbláum lit og færir sig samfellt í gegn um bláa og græna liti yfir í gulan. Hægt er að skipta samfelldu skölunum í tvo flokka: Þá sem eru enda á hvítum lit eða a.m.k. mjög ljósum lit og þá sem enda á aðeins dekkri lit. Skalarnir sem enda á (nánast) hvítum lit henta ekki til að teikna punktarit eða línurit á hvítum bakgrunni, en gætu hentað fyrir hæðarlitamyndir (sbr. landakort þar sem hæstu fjallatindar eru hvítir). Meðal hinna skalanna eru nokkrir marglitir, sumir með liti í svipaðri röð og í regnboganum og nokkrir þar sem allir litirnir hafa sama tón eða annan af tveimur. Eftirfarandi mynd sýnir hæðarlínur fallsins \(f(x,y) = \sqrt{x^2 + 3y^2}\) með 15 skölum í seinni flokknum:

Mynd 7: Samfelldir litaskalar sem henta fyrir línurit og punktarit¶
(vinnubók til að búa myndina til). Af ein- og tvítóna skölum líta t.d. copper, winter og viridis (sá sjálfgefni) vel út, en af litríkari skölum t.d. gnuplot, rainbow og jafnvel nipy_spectral.
Flokkunarskalar
Megindlegu litaskalarnir sem eru innbyggðir í Matplotlib eru m.a. Accent, Dark2 og Set2 með 8 litum hver, Set1 meðy9 litum, tab10 með 10 litum, Set3 með 12 litum og tab20 með 20 litum. Litir þessara skala eru misvel aðgreinanlegir, en Set1 er allgóður fyrir allt að 9 liti (með því að dekkja gula litinn í því smávegis), og tab20 er þokkalega góður óbreyttur fyrir allt að 20 liti.
Sá galli er á notkun þessara litaskala er að þeir duga illa nema fjöldi hópa sem teikna skal sé nákvæmlega jafn fjöldanum í skölunum. Til að bæta úr því má búa til litaskala með tilteknum litafjölda, allt að 20, með eftirfarandi falli.
[efni í vinnslu]