Numerička obrada podataka i simulacije (6. deo)

Autor: Stefan Nožinić

Plotovanje

Često nakon obrade nekih podataka, naprimer nakon neke simulacije, želimo da rezultate vizuelno prikažemo kako bi nam bilo lakše da ih bolje razumemo. Očigledno je da će nam za ovo trebati grafičko okruženje. Ako ste nekada programirali grafičke aplikacije, sigurno znate koliko je vremena potrebno za programiranje aplikacije koja iscrtava grafikon sa svim mogućnostima zumiranja, skaliranja i pomeranja. Kako je vizuelizacija podataka sve bitnija u odlučivanju da li neki rezultati imaju smisla ili ne, pojavila se potreba za programskim bibliotekama za brzo iscrtavanje grafika raznih tipova.

Matplotlib (eng. Matplotlib) je baš takva biblioteka. Pisana je u Pajtonu i vrlo se lako koristi. Pored toga što je dosta intuitivna za korišćenje, dokumentacija iste je jako bogata primerima koda i slikama.

Prvi primer

Najjednostavniji način da napravite grafikon koji spaja date tačke je sledeći:

>>> import matplotlib.pyplot as plt
>>> plt.plot([1,2,3], [4,5,6])
[<matplotlib.lines.Line2D object at 0x7f33787c8b70>]
>>> plt.show()

Primetite da kao prvi argument plot funkcije prosleđujemo x vrednosti a kao drugi y vrednosti.

kd-45-01

Naravno, kako svaka funkcija u NumPaj biblioteci vraća niz za dati niz, odnosno vektorizovana je – možemo lako crtati i grafikone funkcija bez ikakvog for ciklusa eksplicitno.

Primer dajemo za crtanje grafika sinusne funkcije:

>>> x = np.linspace(0, 6.28, 10000)
>>> y = np.sin(x)
>>> plt.plot(x,y)
[<matplotlib.lines.Line2D object at 0x7f61840d5278>]
>>> plt.show()
kd-45-02

Na jednoj slici možemo nacrtati i više grafikona. Za svaki poziv plot funkcije pre show Matplotlib će generisati dodatnu krivu i njoj dodeliti boju tako da se lakše razlikuje od prethodne.

>>> plt.plot(x,y)
[<matplotlib.lines.Line2D object at 0x7f61840b64a8>]
>>> plt.plot(2*x,y)
[<matplotlib.lines.Line2D object at 0x7f61840f2a20>]
>>> plt.show()
kd-45-03

Primetite da je plava kriva prekinuta na polovini. Ovo se dešava jer nema podataka za naredne vrednosti. Ako želimo da ograničimo naš grafikon na određeni opseg, koristimo xlim i ylim funkcije.

>>> plt.plot(x,y)
[<matplotlib.lines.Line2D object at 0x7f617f56b0f0>]
>>> plt.plot(2*x,y)
[<matplotlib.lines.Line2D object at 0x7f618418d0f0>]
>>> plt.xlim(0, 6.28)
(0, 6.28)
>>> plt.show()

Grafikon je moguće zumirati, pomerati i moguće ga je sačuvati kao png sliku koju kasnije možete zasebno publikovati negde.

kd-45-04

Plotovanje slika

Moguće je učitati i neku postojeću sliku, na njoj izvršiti neke transformacije i to onda plotovati:

>>> img = plt.imread("libre.png")
>>> plt.imshow(img)
<matplotlib.image.AxesImage object at 0x7f617f54d7b8>
>>> plt.show()

Potrebno je primetiti da je ovde img matrica koja predstavlja našu sliku.

kd-45-08

Histogrami

Histogrami se isto lako iscrtavaju pomoću bar funkcije.

>>> x = np.arange(100)
>>> y = np.random.random(100)
>>> plt.bar(x,y)
<Container object of 100 artists>
>>> plt.show()
kd-45-05

Naravno, sam izgled bar plota se može dodatno podešavati kroz pozive drugih funkcija koje detaljnije možete izučiti u dokumentaciji.

Vektorska polja

Vektorska polja su grafikonske funkcije koja u određenoj poziciji predstavlja vektor. Primer ovakvih funkcija je brzina vetra. Brzina ima smer, intenzitet i pravac. U svakoj tački je (obično) različita.

>>> y,x = np.mgrid[0:10:1, 0:10:1]
>>> u = y**2 + 1
>>> v = x**2
>>> plt.quiver(u,v)
<matplotlib.quiver.Quiver object at 0x7f617d72d0f0>
>>> plt.show()
kd-45-06

Zanimljiva je primena mgrid matrice (primetite da su x,y matrice i to x se ne menja po koloni a y po redu). Ovo je jako korisno za brzu evaluaciju funkcija u datim tačkama.

>>> f = (x-4.5)**2 + (y-4.5)**2
>>> plt.imshow(f)
<matplotlib.image.AxesImage object at 0x7f61875b0a58>
>>> plt.show()
kd-45-07

U sledećem delu ćemo sve ovo primeniti kako bismo uspeli da simuliramo neke fizičke procese rešavanjem diferencijalnih jednačina.


Ostavite odgovor

Vaša adresa e-pošte neće biti objavljena. Neophodna polja su označena *

Time limit is exhausted. Please reload CAPTCHA.