.. include:: rst-include Teikning með Matplotlib ======================= Inngangur ~~~~~~~~~ Matplotlib er teiknipakki fyrir Python sem er byggður á tölvugrafík í Matlab-kerfinu. Með Matplotlib er hægt að teikna (eða birta, sýna) myndir (*images*), hæðarlínur (*countours*), punktarit (*scatter plot*), línurit og gröf (*line plots*) og þrívíðar *upplýstar* myndir. Pakkinn er þannig að framendinn (*frontend*) eða skilgreining teikningarinnar er aðskilinn frá bakendanum (*backend*) sem birtir hana. Þannig er hægt að skrifa forrit sem býr til teikningu, og svo er hægt að sýna teikninguna inni í Jupyter-bók, sem sjálfstæðan glugga á skjá, á vef, í pdf-skjali, í Latex-skjali, á prentara o.s.frv. án þess að breyta teikniforritinu sjálfu. Auk þess er hægt að fá alls kyns viðbætur við Matlplotlib, t.d. fyrir kortagerð, þrívíða teikningu, samskipti við Pandas og samskipti við Excel, svo fáeinar séu nefndar. Af þessum viðbótum er er líklega helstan að telja pakkann `Seaborn `_, sem tengist Pandas nánum böndum. Markmið höfunda Seaborn er að teikna sem "nútímalegust" tölfræðileg gröf á sem sjálfvirkastan máta. Eftirfarandi mynd sýnir dæmi um myndir teiknaðar með Matplotlib. .. figure:: myndir/matplotlib-dæmi.jpeg :align: center :figwidth: 15cm Matplotlib myndir .. admonition:: Athugasemd: Skipun eða fall :class: athugid Hér verður talað um teikniskipanir þegar strangt tiltekið ætti kannski frekar að tala um teikniföll: scatter-fallið, plot-fallið o.s.frv. Einn kostur við að segja frekar *skipun* er að það veldur síður ruglingi þegar verið er að teikna föll. Einfaldar myndir ~~~~~~~~~~~~~~~~ Undirbúningur teikningar ------------------------ Venjulegasta notkun Matplotlib er að nota undirpakkann *pyplot* og í Matplotlib notendahandbókinni er mælt með að flytja hann inn sem *plt*, svo það er fyrir vikið alsiða. Teiknaðar myndir birtast sjálfkrafa inni í bókinni, neðan við forritsreitinn. Hér er kafli sem hægt er að setja fremst í vinnubók sem teiknar, þar sem bætt hefur verið við skipunum sem láta rúðunet teiknast undir öðrum teiknuðum hlutum, breyta sjálfgefinni stærð myndar, og koma í veg fyrir að fyrirsagnir og ásamerkingar yfirskrifi hver aðra. .. code:: python # Frumstilling teikningar import matplotlib.pyplot as plt plt.rc('axes', axisbelow=True) plt.rc('figure', figsize=(8,4)) # (6,4) er sjálfgefið plt.rc('figure.constrained_layout', use=True) # forðast skörun myndhluta Punktarit og línurit -------------------- Ein mikilvægasta notkunin á Matplotlib er að teikna myndir af talnalistum, sem geta hvort sem er verið venjulegir Python listar eða NumPy vigrar eins og við kynnumst í :numref:`numpy`. kafla. Hér er forrit sem teiknar punktana :math:`(x,y)` þar sem :math:`y = \sqrt x` fyrir :math:`x = 0, 1, 2, 3, 4, 5` og tengir þá með beinum línustrikum. Skipunin ``plt.figure`` býr til nýja mynd og tilgreinir breidd hennar og hæð, scatter-skipunin teiknar punktana sjálfa með flatarmál u.þ.b. 40 ferpunkta (punktur ≈ 1/3 mm) og plot-skipunin teiknar strikin á milli þeirra. Að lokum teiknar grid rúðunet. Í ``skipuninni`` er hægt að tilgreina lit punkta, sbr. fyrra sýnidæmið í kafla :numref:`dæmi um teikningu talnagagna` og þeir geta líka verið hver með sínum lit sbr. dæmið um besta plan í kafla :numref:`gervigögn og aðhvarf`. .. code:: python from math import sqrt x = list(range(6)) y = [sqrt(xi) for xi in x] plt.figure(figsize=(7,3)) plt.scatter(x,y,s=50) plt.plot(x,y) plt.grid(True) .. figure:: myndir/matplotlib-kynning.png :align: center :figwidth: 11cm .. admonition:: Athugasemd: Einingar í *figsize* :class: athugid Stærð myndarinnar er gefin í tommum og (6,4) er sjálfgefið. Myndin er sköluð niður í ca. 2/3 þegar hún birtist á venjulegum fartölvuskjá, en er (a.m.k. nokkurnvegin) ósköluð ef bókin er prentuð sem pdf. .. admonition:: Æfing: :class: aefing Afritið skipanirnar að ofan inn í vinnubók og keyrið. Prófið að breyta: - fjölda punkta - stærð myndarinnar - stærð punktanna (aftasti stikinn í ``scatter``) - sleppa rúðunetinu Súlurit ------- Hér er búið til súlurit (*histogram*) af normaldreifðum slembigögnum. Stikinn ``bins`` gefur fjölda súlna og ``range`` gefur svæðið á x-ás sem súluritið nær yfir. Góð regla er að láta súlurnar mætast í rúnnuðum (*round*) tölum t.d. heilum eða hálfum (hér mætast þær í hálfum tölum). Kallið ``gauss(mu,sigma)`` skilar slemitölu úr normaldreifingu með meðaltal mu og staðalfrávik sigma (Gauss-dreifing er annað nafn á normaldreifingu) .. code:: python import matplotlib.pyplot as plt from random import gauss x = [gauss(0,1) for i in range(500)] plt.hist(x, bins=12, range=(-3,3)) plt.xlabel('x') plt.ylabel('fjöldi gilda á hverju bili (af 500)') plt.show() .. figure:: myndir/sulurit.png :align: center :figwidth: 11cm Skipunin ``hist`` reiknar sjálf hæð hverrar súlu en það er líka hægt að láta hæð súlnanna koma úr lista eða vigri með því að nota skipunina ``bar``. Um það er sýnt dæmi í næsta kafla. .. admonition:: Æfing: :class: aefing Prófið skipanirnar að ofan. Prófið að fækka og fjölga punktum. Prófið líka að nota 6 súlur (það þarf að breyta bæði bins og range). .. admonition:: Athugasemd: Kyrrstæðar og lifandi myndir :class: athugid Myndirnar í þessum :numref:`teikning með matplotlib`. kafla eru kyrrstæðar (*static*) en Matplotlib getur líka búið til bæði hreyfimyndir (*animated*) og lifandi (*interactive*) myndir með stýrihlutum (`widgets `_), t.d. hnöppum og sleðum, hvort sem er í úttaksglugga í vinnubók eða í sérstökum sjálfstæðum myndaglugga (amk. með JupyterLab). Þá má láta myndina hreyfast eins og í teiknimynd eða breytast með músastýringu. Lítið dæmi um lifandi mynd með stýrisleða er í kafla :numref:`lifandi matplotlib mynd` og dæmi um hreyfimynd er í kafla :numref:`rétthyrningur sem snýst`. Skipunin ``plt.show()`` er valkvæð þegar teiknað er beint í vinnubók, en hana þarf ef sérstakur gluggi er opnaður. Notkun hennar hefur þann viðbótarkost að losna við aukaupplýsingar sem sumar teikniskipanir skrifa ef þær eru aftast í vinnubók. Teikningar af gögnum í skrám ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Innlestur talnagagna í dálkum ----------------------------- Algengt er að maður vilji teikna upplýsingar sem eru geymdar í skrám, og oft eru það dálkar í skránni sem þarf að teikna. Í sýnidæminu í kafla :numref:`innlestur textaskrár af vefnum` var sýnt hvernig hægt er að lesa dálka í slíkri skrá inn í lista af strengjum. Ef dálkarnir geyma tölur þarf beita ``float``-fallinu á innihaldið. Til að lesa inn skrá ``xy.txt`` með tveimur talnadálkum má nota: .. code:: python x = [] y = [] with open("xy.txt") as f: for lína in f: (xs, xy) = lína.split() x.append(float(xs)) y.append(float(xy)) plt.plot(x,y) Ef skráin er á vefnum þarf í fyrsta lagi að nota ``urlopen`` í stað ``open`` og svo þarf líka að nota ``decode()`` á línuna, eins og gert var í kafla :numref:`innlestur textaskrár af vefnum`. Annar möguleiki er svo að nota NumPy sem er á dagskrá í :numref:`%s. kafla`. Dæmi um teikningu talnagagna ---------------------------- Hér eru tvö sýnidæmi um teikningu gagna sem eru fengin úr gagnaskrám. Það fyrra teiknar punktarit (*scatter plot*) og það síðara súlurit. .. admonition:: Sýnidæmi: Eðlisþyngd og bræðslumark :class: synidaemi Í kafla :numref:`csv-lestur-bilafmark` var skoðuð skrá með bræðslumarki og eðlisþyngd fjögurra málma (sbr. líka :numref:`verkefni %s`. Hér er forrit sem teiknar punktarit af `skránni `_. .. code:: python from urllib.request import urlopen import matplotlib.pyplot as plt with urlopen("https://cs.hi.is/python/malmar.txt") as f: next(f) # sleppa fyrirsögnum nafn = [] eðlisþ = [] bræðslum = [] for lína in f: (n,e,b) = lína.decode().split() nafn.append(n) eðlisþ.append(float(e)) bræðslum.append(float(b)) plt.scatter(eðlisþ, bræðslum, s=40, color='Crimson') plt.grid(True) plt.xlim(0,20) plt.ylim(800,1800) for (x,y,n) in zip(eðlisþ, bræðslum, nafn): plt.text(x, y, n + " ", fontsize=16, color='DarkBlue', ha="right", va="center") plt.xlabel('Eðlisþyngd g/ml') plt.ylabel('Bræðslumark °C') plt.show() Hér fylgir myndin sem birtist, og tækifærið hefur verið notað til að sýna hvernig hægt er að skrifa texta inn á mynd með ``plt.text`` (sjá töflu :numref:`%s`) .. figure:: myndir/malmar.jpg :align: center :figwidth: 10cm .. admonition:: Sýnidæmi: Kosningasúlurit :class: synidaemi Hér er dæmi sem teiknar súlurit af kosningaúrslitunum 2021. Þessi úrslit eru aftur á dagskrá í verkefnum :numref:`verkefni %s`) og :numref:`kosningaúrslit í lit`; í því síðara er fínna súlurit búið til. .. code:: python from urllib.request import urlopen import matplotlib.pyplot as plt with urlopen("https://cs.hi.is/python/kosningar-2021.txt") as f: next(f) listi = [] atkvæði = [] for lína in f: (l, a, þs) = lína.decode().split() listi.append(l) atkvæði.append(float(a)) x = range(len(listi)) plt.figure(dpi=90) plt.bar(x, atkvæði, color="tomato") plt.xticks(x, listi); plt.ylabel('Atkvæði') plt.title('Úrslit alþingiskosninga 2021') plt.show() Hér er verður x listinn [0,1,2...10] (það voru 11 framboðslistar). Hér er `listi `_ yfir liti. Forritið teiknar svo þessa mynd: .. figure:: myndir/kosningar-2021.jpg :align: center :figwidth: 13cm .. admonition:: Æfing: Súlurit af einkunnum :class: aefing Notið ``hist`` til að teikna súlurit af einkunnunum í skránni `https://cs.hi.is/python/einkunn.txt `_. Töflur yfir Matplotlib-skipanir ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Hér eru töflur yfir helstu teikniskipanirnar, stýristika og stýriskipanir. Aftast í seinni dálki taflanna er víða í svigum tilvísun í kafla sem útskýrir notkun viðkomandi skipunar eða stika. Eins og framar í þessum fyrirlestrarnótum eru töflurnar fyrst og fremst hugsaður til uppflettingar og ekki til að læra utanað. Fyrst er tafla yfir aðal teikniskipanirnar og svo sérstök tafla bara um hvernig hægt er að setja texta inn á myndir með *text*-skipuninni. .. list-table:: Helstu teikniskipanir :widths: auto :align: center * - ``figure`` - Býr til mynd (kafli :numref:`punktarit og línurit` og :numref:`fínna graf`) * - ``scatter`` - Teiknar punkta í tilgreindum x- og y-hnitum (:numref:`punktarit og línurit`) .. og :numref:`teikning-punktasafns`) * - ``plot`` - Teiknar línustrik sem tengja saman punkta :numref:`dæmi um plot` og :numref:`einfalt graf`) * - ``hist`` - Teiknar súlurit yfir tíðni – hæð súlna fæst með talningu (:numref:`súlurit` og :numref:`dæmi um hist`) * - ``bar`` - Teiknar súlurit með gefinni súluhæð (:numref:`dæmi um teikningu talnagagna`) * - ``savefig`` - Vistar teikningu í png-skrá (``savefig("skrá.png")``) * - ``text`` - Skrifar texta inn á mynd (sjá töflu ref:`%s`) (:numref:`innlestur talnagagna í dálkum`) * - ``show`` - Birtir mynd (þarf ekki ef teiknað er í glugga í vinnubók (:numref:`súlurit`) .. csv-table:: Texti settur inn á mynd :widths: auto :delim: ; :name: text-fallið :align: center ``text(x,y,"texti")`` ; skrifar texta aftan við punkt (x,y) ``text(..., fontsize=n)`` ; – með n punkta letri (:numref:`innlestur talnagagna í dálkum`) ``text(...,va="top")`` ; – neðan við punkt (*vertical alignment*) (:numref:`innlestur talnagagna í dálkum`) ``text(...,va="bottom")`` ; – ofan við punkt (eða center/baseline) ``text(...,ha="left")`` ; – aftan við punkt (*horizontal algn*) ``text(...,ha="center")`` ; – með punkt í miðjum texta (eða right) Teikniskipanirnar bjóða svo upp á fjölda stýristika (*control parameters*) til að stjórna lit teikninga, breidd súlna, leturstærð, merkingum ása o.s.frv. Auk stýristikanna eru svo notaðar ýmsar hjálpar- eða stýriskipanir til breyta mörkum ása, bæta við skýringartextum, rúðuneti o.fl. Næstu töflur gefar yfirlit yfir helstu stýristika og stýriskipanir. .. list-table:: Helstu stikar í **plot**, **hist** og **bar** :widths: auto :name: plothiststýring :align: center * - ``color`` - Litur línurits (grafs) eða súlurits. Má skammstafa r, g, b, y, w, k |br| (black), c (cyan), m (magenta) eða nota streng með `litanafni; `_ |br| ``color`` má skammstafa ``c`` í plot en ekki í hist og bar (:numref:`dæmi um teikningu talnagagna` og :numref:`dæmi um plot`). * - ``alpha`` - gagnsæi, 0 alveg gagnsætt, 1 alveg ógagnsætt (sjálfgefið) * - ``linewidth`` eða ``lw`` - Breidd línu í línuriti eða súluramma í súluriti. Eining punktar |br| (~1/3 mm), sjálfgefið lw=1.5 (:numref:`dæmi um plot`) * - ``linestyle`` eða ``ls`` - Línutegund, getur t.d. verið ``''`` (engin lína) ``':'`` |br| (punktalína), ``'-'`` (heil lína, sjálfgefið) (:numref:`dæmi um plot`) * - ``marker`` - Merki fyrir punkta í plot. Algengur marker er ``'o'`` (en líka má nota |br| ``'.' '+' 'x'`` og fleiri); plot-skipun með ``marker = 'o', ls=''`` |br| gefur svipaða niðurstöðu og ``scatter`` með sjálfgefnum stikum (:numref:`dæmi um plot`) * - ``markersize`` eða ``ms`` - Stærð *markers* í ``plot``, sjálfgefið 6 punktar (~2 mm) (k. :numref:`dæmi um plot`) * - ``edgecolor`` eða ``ec`` - Litur á rönd súlna eða merkja. Ein tegund súlurita notar |br| ``color='w', ec='k'`` (:numref:`dæmi um hist`) * - ``label`` - notað með ``legend``-skipun, (sjá töflu :numref:`%s`) (:numref:`dæmi um legend`) * - ``bins`` - fjöldi súlna (:numref:`súlurit` og :numref:`dæmi um hist`) * - ``range`` - ytri mörk súlurits (gott að velja bins í samræmi við range) (k. :numref:`súlurit` og :numref:`dæmi um hist`) * - ``rwidth`` - "relative width" (sjálfgefið 1.0) (:numref:`dæmi um hist`) .. list-table:: Helstu stikar í **scatter** :widths: auto :name: scatterstýring :align: center * - ``marker`` - Merki fyrir punkta, sjá *marker* í töflu :numref:`%s` * - ``s`` - stærð punkta, flatarmál í *ferpunktum* (punktur ≈ 1/3 mm). Má vera vigur og |br| þá fær hver punktur sína stærð (:numref:`dæmi um plot`) * - ``color`` - litur (allir punktar í sama lit), sjá *color* í töflunni að ofan (:numref:`dæmi um teikningu talnagagna`) * - ``c`` - vigur af litum (hver punktur í sínum lit). Má vera vigur af tölum og þá litast |br| punktarnir með **litaskala** (*color map*; sjá athugasemd hér fyrir neðan) (:numref:`gervigögn og aðhvarf`) * - ``alpha`` - gagnsæi, sjá töfluna að ofan * - ``edgecolor`` - litur á rönd punkta .. admonition:: Athugasemd: Um punktastærð :class: athugid Sjálfgefin punktastærð er 36 = 6^2, sem gefur sömu stærð og ``o``-merki í plot-skipun með *markersize* 6 (sem er sjálfgefna stærðin í plot). Ath. að það er ekki stutt að skrifa :code:`size` í stað :code:`s` .. admonition:: Athugasemd: Um litaskala :class: athugid Þessar fyrirlestrarnótur skauta framhjá umfjöllun um **litaskala**, en um þá er fjallað allítarlega í `Viðauka A4 `_ í *Valin efni í stærðfræði og reiknifræði*. Um litaskala er líka fjallað í 4. kafla í `Python Data Science Handbook `_. .. list-table:: Helstu hjálparskipanir fyrir teikningar :widths: auto :name: plothjálparskip :align: center * - ``plt.xlim(min,max)`` - stillir neðri og efri mörk x-áss (kafli :numref:`þrjú dæmi um teikningar`) * - ``plt.ylim(min,max)`` - Stillir neðri og efri mörk y-áss (:numref:`þrjú dæmi um teikningar`) * - ``plt.clim(cmin, cmax)`` - Stillir neðri og efri mörk \"litaáss\" innan **litaskala** sem er |br| í notkun – sjá athugasemd hér næst á undan (:numref:`gervigögn og aðhvarf`) * - ``plt.title(strengur)`` - setur fyrirsögn á teikningu (:numref:`dæmi um teikningu talnagagna`) * - ``plt.xlabel(strengur)`` - setur textaskýringu við x-ás (:numref:`súlurit`, :numref:`dæmi um plot` og :numref:`dæmi um hist`) * - ``plt.ylabel(strengur)`` - setur textaskýringu við y-ás (:numref:`súlurit`, :numref:`dæmi um plot` og :numref:`dæmi um hist`) * - ``plt.xticks(listi)`` - setur merkingar á tilgreindar staðsetningar á x-ás |br| (``listi`` gæti t.d. verið ``range(0,6)``) (:numref:`dæmi um teikningu talnagagna`) * - ``plt.yticks(listi)`` - setur merkingar á tilgreindar staðsetningar á y-ás * - ``plt.xticks(listi, merki)`` - setur bæði staðsetningar og merkingar (eins fyrir y-ás) * - ``plt.gca().set_xticklabels`` |br| ``(['A', 'B', 'C'])`` - lætur merkingar á x-ás verða A, B og C (eins fyrir y-ás) * - ``plt.tick_params(length=l,`` |br| ``width=w, direction="in")`` - stillir strikin við ásamerkingarnar (l og w mælt |br| í punktum (1/3 mm)); í stað ``"in"`` má nota ``"out"``) * - ``plt.grid(True)`` - teiknar rúðunet (nota má ``grid(True, axis='y')`` fyrir |br| bara láréttar línur) (:numref:`punktarit og línurit`, :numref:`dæmi um legend` og :numref:`dæmi um hist`) * - ``plt.box(False)`` - fjarlægir ramma utanum teikningu (:numref:`fínna graf`) * - ``plt.axvline(x)`` - bætir við lóðréttri línu (sjálfgefið er x = 0) (:numref:`fínna graf` og :numref:`graf vísisfallsins exp(x)`) * - ``plt.axhline(y)`` - bætir við láréttri línu (sjálfgefið er y = 0) (:numref:`fínna graf` og :numref:`graf vísisfallsins exp(x)`) * - ``plt.legend()`` - bætir við kassa með skýringum á línum/skatter-punktum |br| / súlum sem búnar voru til með ``label``; sjá töflu :numref:`%s` (:numref:`dæmi um legend`) Loks er hér `hlekkur `_ á yfirlit yfir allar Matplotlib-skipanir. Þrjú dæmi um teikningar ~~~~~~~~~~~~~~~~~~~~~~~ Til frekari glöggvunar eru hér þrjú viðbótardæmi og nokkrar æfingar. Dæmi um plot ------------ .. code:: python from math import sqrt x = range(5) y = [sqrt(t) for t in x] plt.figure(figsize=(4, 1.8), dpi=90) # dpi=72 sjálfgefið plt.plot(x, y, lw=3, ls=':', c='r', marker='o', ms=8) plt.xlabel('x') plt.ylabel('y = √x') .. figure:: myndir/rauttgraf.png :align: center :figwidth: 7cm .. admonition:: Æfing: Stikar í plot :class: aefing Prófið þessar skipanir. Prófið að breyta: - dpi (*dots-per-inch*; myndin stækkar) - ls (*line style*, prófið ``'-'``) - lw (*line width*) - c (*color* prófið t.d. ``'b'``) - marker (prófið ``'+'`` og ``'x'``) - ms (*marker size*) Dæmi um legend -------------- .. code:: python from math import pi, sin from random import random t = [k*2*pi/20 for k in range(21)] s = [sin(x) for x in t] y = [random() for k in range(21)] plt.figure(figsize=(5,2)) plt.plot(t, s, label='sin(x)') plt.plot(t, y, label='slembitölur') plt.grid(True) plt.legend(); .. figure:: myndir/legend-daemi.png :align: center :figwidth: 9cm .. admonition:: Æfing: Legend :class: aefing Prófið þessar skipanir. Prófið svo að bæta við cos(x) með tilheyrandi label. Prófið líka að fjölga punktunum (það þarf að breyta bæði 20 og 21 í stærri tölur). Dæmi um hist ------------ .. code:: python from random import gauss x = [gauss(0,1) for i in range(500)] plt.figure(figsize = (6,3)) plt.hist(x, bins=12, range=(-3,3), rwidth=0.8, color='c', ec='k'); plt.xlabel('x-gildi'); plt.ylabel('fjöldi'); plt.grid(True, axis='y') .. figure:: myndir/sulur2.png :align: center :figwidth: 11cm .. admonition:: Æfing: Súlurit :class: aefing Prófið skipanirnar og einhverjar breytingar á þeim. Stikunum er lýst í töflu :numref:`%s ` Teikning af gröfum falla ~~~~~~~~~~~~~~~~~~~~~~~~ Við byrjum þennan kafla á æfingu, sem snýst bæði um efni undanfarandi kafla og þessa. Lesendur eru hvattir til að spreyta sig á henni áður en þeir lesa áfram því hér á eftir koma svör við ýmsum atriðum í henni. .. .. Æfing .. hint:: Opnið vinnubókina :h:`Fallateikning` Colab og fylgið leiðbeiningum í henni. Til að teikna graf er byrjað á að núllstilla með því að keyra: .. code:: python import matplotlib.pyplot as plt plt.rc('axes', axisbelow=True) def linspace(a,b): return [a + (b-a)*i/200 for i in range(201)] Með ``linspace(a,b)`` fæst listi með 200 jafnt dreifðum þétt liggjandi :math:`x`-gildum á bilinu frá a til b, og svo reiknum við fallsgildin :math:`y = f(x)` í öllum þessum :math:`x`-um og nálgum graf fallsins með því að teikna línustrik sem tengja alla punktana. Einfalt graf ------------ Við getum teiknað graf sínus-fallsins á bilinu :math:`[0, 4\pi]` með: Forrit: .. code:: python from math import pi, sin, cos, exp x = linspace(0, 4*pi) y = [sin(xi) for xi in x] plt.plot(x, y); Úttak: .. figure:: myndir/output_3_0.png :align: center :figwidth: 9cm Fínna graf ---------- Hægt er að bæta ýmsu við forritsbúinn í kafla :numref:`einfalt graf`. Byrjum á að afrita hann og endurbætum hann svo: - teygjum á grafinu (breikkum myndina) með skipuninni ``plt.figure(figsize=(12,4))`` (á undan plot). - Svo má bæta við rúðuneti með ``plt.grid`` - Það er hægt að teikna x- og y-ása með ``plt.axhline`` og ``plt.axvline``. Notið með stika ``c='k'`` til að fá svarta ása. - Við getum látið x-ásinn ná t.d. frá -0.2 til :math:`4\pi` með ``plt.xlim([-0.2, 4*pi])``. - Það má fjarlægja rammann með ``plt.box(False)`` - Síðasta tötsið fæst með ``plt.tick_params(length=0)`` Forrit (sjá úttak í svari við lið 3): .. code:: python plt.figure(figsize=(15,4)) plt.grid(True) plt.axvline(c='k') plt.axhline(c='k') plt.box(False) x = linspace(0, 4*pi) y = [sin(xi) for xi in x] plt.plot(x, y) plt.xlim([-0.2, 4*pi]) plt.tick_params(length=0); Kósínus bætt við ---------------- Teiknum í framhaldi :math:`y = \cos x` inn á sömu mynd. Forrit: .. code:: python yc = [cos(xi) for xi in x] plt.plot(x, yc) Úttak (úr :numref:`fínna graf` og :numref:`kósínus bætt við`): .. figure:: myndir/output_6_0.png :align: center :figwidth: 16cm Graf vísisfallsins exp(x) ------------------------- Teiknum nú nýja mynd með :math:`y = e^x` á bilinu :math:`[-5, 2]`. Forrit: .. code:: python (a,b) = (-5,2) x = linspace(a,b) plt.figure(figsize=(9,6)); plt.grid(True) plt.axvline(c='k'); plt.axhline(c='k') plt.box(False) plt.plot(x, [exp(t) for t in x]) plt.xlim([a,b]) plt.tick_params(length=0) Úttak: .. figure:: myndir/output_7_0.png :align: center :figwidth: 12cm .. admonition:: Æfing: Fallateikning. :class: aefing Æfið ykkur í að teikna föll með því að nota hugmyndir í þessum kafla. Teiknið t.d. gröf eftirfarandi falla og prófið ykkur áfram í hverju tilviki til að finna hæfilegt bil á x-ás svo helstu eiginleikar fallanna komi fram. Þið getið byrjað á að afrita forritið hér næst á undan. 1. :math:`x\sin x` 2. :math:`e^{-2x+1}`