Interaktív függvények és ábrák

Az alábbiakban vizsgáljunk meg egy egyszerű módszert arra, hogy hogyan tehetjük Python-függvényeinket interaktívvá! Ehhez az ipywidgets csomag lesz segítségünkre!


In [1]:
%pylab inline
from ipywidgets import *  # az interaktivitásért felelős csomag


Populating the interactive namespace from numpy and matplotlib

Mostanra már tudjuk, hogy hogyan ábrázoljunk egy matematikai függvényt:


In [2]:
t=linspace(0,2*pi,100);
plot(t,sin(t))


Out[2]:
[<matplotlib.lines.Line2D at 0x7f4fd17b5198>]

Írjunk egy függvényt, ami egy megadott frekvenciájú jelet rajzol ki!


In [3]:
def freki(omega):    
    plot(t,sin(omega*t))

In [4]:
freki(2.0)


Most jön a varázslat! Az interact() függvény segítségével interaktívvá tehetjük a fent definiált függvényünket!


In [5]:
interact(freki,omega=(0,10,0.1));


Nézzük meg egy kicsit közelebbről, hogy is működik ez az interact() konstrukció! Definiáljunk ehhez először egy nagyon egyszerű függvényt!


In [6]:
def func(x):
     print(x)

Az interact egy olyan függvény, amely az első paramétereként egy függvényt vár, és kulcsszavakként várja a függvény bemenő paramétereit! Amit visszaad, az egy interaktív widget, ami lehet sokfajta, de alapvetően azt a célt szolgálja, hogy a func függvényt kiszolgálja. Annak ad egy bemenő paramétert, lefuttatja, majd vár, hogy a felhasználó újra megváltoztassa az állapotot. Ha a kulcsszavas argumentumnak zárójelbe írt egész számokat adunk meg, akkor egy egész számokon végigmenő csúszkát kapunk:


In [7]:
interact(func,x=(0,10));


10

Ha egy bool értéket adunk meg, akkor egy pipálható dobozt:


In [8]:
interact(func,x=False);


True

Ha egy általános listát adunk meg, akkor egy legördülő menüt kapunk:


In [9]:
interact(func,x=['hétfő','kedd','szerda']);


hétfő

Ha a sima zárójelbe írt számok nem egészek (legalább az egyik) akkor egy float csúszkát kapunk:


In [10]:
interact(func,x=(0,10,0.1));


3.3

Ha pontosan specifikálni szeretnénk, hogy milyen interaktivitást akarunk, akkor azt az alábbiak szerint tehetjük meg,

egész csúszka$\rightarrow$IntSlider()

float csúszka$\rightarrow$FloatSlider()

legördülő menü$\rightarrow$Dropdown()

pipa doboz$\rightarrow$Checkbox()

szövegdoboz$\rightarrow$Text()

Ezt alább néhány példa illusztrálja:


In [11]:
interact(func,x=IntSlider(min=0,max=10,step=2,value=2,description='egesz szamos csuszka x='));


6

In [12]:
interact(func,x=FloatSlider(min=0,max=10,step=0.01,value=2,description='float szamos csuszka x='));


6.05

In [13]:
interact(func,x=Dropdown(options=['Hétfő','Kedd','Szerda'],description='legörülő x='));


Kedd

In [14]:
interact(func,x=Checkbox());


True

In [15]:
interact(func,x=Text());


xfsyfsdfsdfds

Ha egy függvényt sokáig tart kiértékelni, akkor interact helyett érdemes interact_manual-t használni. Ez csak akkor futtatja le a függvényt, ha a megjelenő gombot megnyomjuk.


In [16]:
interact_manual(func,x=(0,10));


2

A widgetekről bővebben itt található több információ. Végül nézünk meg egy több változós interactot!


In [17]:
t=linspace(0,2*pi,100);
def oszci(A,omega,phi,szin):
    plot(t,A*sin(omega*t+phi),color=szin)
    plot(pi,A*sin(omega*pi+phi),'o')
    xlim(0,2*pi)
    ylim(-3,3)
    xlabel('$t$',fontsize=20)
    ylabel(r'$A\,\sin(\omega t+\varphi)$',fontsize=20)
    grid(True)

In [18]:
interact(oszci,
            A    =FloatSlider(min=1,max=2,step=0.1,value=2,description='A'),
            omega=FloatSlider(min=0,max=10,step=0.1,value=2,description=r'$\omega$'), 
            phi  =FloatSlider(min=0,max=2*pi,step=0.1,value=0,description=r'$\varphi$'),
            szin =Dropdown(options=['red','green','blue','darkcyan'],description='szín'));