субота, 20 априла, 2024
Како да...?

Нумеричка обрада података и симулације (6. део)

Аутор: Стефан Ножинић

Плотовање

Често након обраде неких података, например након неке симулације, желимо да резултате визуелно прикажемо како би нам било лакше да их боље разумемо. Очигледно је да ће нам за ово требати графичко окружење. Ако сте некада програмирали графичке апликације, сигурно знате колико је времена потребно за програмирање апликације која исцртава графикон са свим могућностима зумирања, скалирања и померања. Како је визуелизација података све битнија у одлучивању да ли неки резултати имају смисла или не, појавила се потреба за програмским библиотекама за брзо исцртавање графика разних типова.

Матплотлиб (енг. Matplotlib) је баш таква библиотека. Писана је у Пајтону и врло се лако користи. Поред тога што је доста интуитивна за коришћење, документација исте је јако богата примерима кода и сликама.

Први пример

Најједноставнији начин да направите графикон који спаја дате тачке је следећи:

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

Приметите да као први аргумент plot функције прослеђујемо x вредности а као други y вредности.

kd-45-01

Наравно, како свака функција у НумПај библиотеци враћа низ за дати низ, односно векторизована је – можемо лако цртати и графиконе функција без икаквог for циклуса експлицитно.

Пример дајемо за цртање графика синусне функције:

>>> 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

На једној слици можемо нацртати и више графикона. За сваки позив plot функције пре show Матплотлиб ће генерисати додатну криву и њој доделити боју тако да се лакше разликује од претходне.

>>> 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

Приметите да је плава крива прекинута на половини. Ово се дешава јер нема података за наредне вредности. Ако желимо да ограничимо наш графикон на одређени опсег, користимо xlim и ylim функције.

>>> 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()

Графикон је могуће зумирати, померати и могуће га је сачувати као png слику коју касније можете засебно публиковати негде.

kd-45-04

Плотовање слика

Могуће је учитати и неку постојећу слику, на њој извршити неке трансформације и то онда плотовати:

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

Потребно је приметити да је овде img матрица која представља нашу слику.

kd-45-08

Хистограми

Хистограми се исто лако исцртавају помоћу bar функције.

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

Наравно, сам изглед бар плота се може додатно подешавати кроз позиве других функција које детаљније можете изучити у документацији.

Векторска поља

Векторска поља су графиконске функције која у одређеној позицији представља вектор. Пример оваквих функција је брзина ветра. Брзина има смер, интензитет и правац. У свакој тачки је (обично) различита.

>>> 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

Занимљива је примена mgrid матрице (приметите да су x,y матрице и то x се не мења по колони а y по реду). Ово је јако корисно за брзу евалуацију функција у датим тачкама.

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

У следећем делу ћемо све ово применити како бисмо успели да симулирамо неке физичке процесе решавањем диференцијалних једначина.