Gnuplot howto oldal - animált ábrák

Ebben a fejezetben szeretnénk felhívni a figyelmet arra a tényre, hogy a gnuplot képes scriptekből is plottolni x-es ablakba, és az egymásután kiadott plot/splot parancsok ugyanabba az ablakba kerülő egymásutáni ábrákat hoznak létre.

Animáció képletből

A következő shellből futtatható script
#!/usr/bin/gnuplot
t=0
set xrange [0:2*pi]
set yrange [-1:1]
p cos(t)*sin(x) ; t=t+0.1
p cos(t)*sin(x) ; t=t+0.1
...

minden sora kirajzolás után a görbe időparaméterét lépteti, ezért minden lépésben más görbét látunk. Mindig adjuk meg az értelmezési tartományt és a képhalmazt, különben mókásan rángatózó animációt kapunk, hiszen az autoskálázó (melyre a set autoscale paranccsal kapcsolhatunk vissza) minden görbét másra skálázna.

Ha nem olvastuk el ciklusszervezést a scriptek fejezetben, akkor kénytelenek vagyunk nagyon sokszor beírni ezt a sort egy fileba. Ezt a következő bash script megoldja:

#!/bin/bash
echo "#!/usr/bin/gnuplot" > sinus.plt
echo "t=0" >> sinus.plt
echo "set xrange [0:2*pi]" >> sinus.plt
echo "set yrange [-1:1]" >> sinus.plt
ciklus_valt=0
ciklus_max=100
while [ $ciklus_valt != $ciklus_max ]
do
echo "p [0:2*pi] [-1:1] cos(t)*sin(x) ; t=t+0.1 " >> sinus.plt
ciklus_valt=`echo $(($ciklus_valt+1))`
done
chmod +x sinus.plt
A fenti példából látszik, hogyan lehet ciklust készíteni bash scriptben. A ciklus_max változóban állíthatjuk be, hány lépésből álljon az animáció.

Lassítani pauseok elhelyezésével lehet.

Ezzel megközelítettük az igazi buherátorokat, hiszen scriptet használunk scriptírásra is.

Animáció gnuplot ciklusból

Mint tudjuk, a reread utasítás hatására a script az elejétől végrehajtódik, ezért a közkézen forgó példákban mindig két script szerepel, egyik a ciklusmag, a másik annak a környezete. A problémát az jelenti, hogy a ciklusváltozó kezdeti értékét nem tudjuk beállítani a ciklusmag scriptben, hiszen az minden lepesben lefut. Mutattunk azonban scriptek fejezetben egy módszert, mellyel egyetlen gnuplot scripttel is lehet ciklust szervezni. Lássunk ezzel egy animációt:
if (pi<3.1415928) set parametric; \
 set xrange[-2:2]; \
 set yrange[-2.5:1]; \
 PI=3.1415927; \
 also=-PI*0.25; \
 f=0.615;
pi=pi+0.25
a=pi-3.1415927
meret=0.7+0.2*sin(a+a*a*0.03)
plot [also:PI]  meret*(1+cos(t)),meret*(sin(t)) notitle w l 1,\
meret*(-1-cos(t)),meret*(sin(t)) notitle w l 1,\
meret*(1+cos(also)+(-sin(also))*(t-PI)*f),\
meret*(sin(also)+cos(also)*(t-PI)*f) notitle w l 1, \
meret*(-1-cos(also)-(-sin(also))*(t-PI)*f),\
meret*(sin(also)+cos(also)*(t-PI)*f) notitle w l 1
if(a<100)reread
pi=2*asin(1)
A kezdeti beállításokat a kezdeti pi értéknél hajtjuk csak végre, majd a pi változót léptetjük.

Animáció adatfile oszlopaiból

Tegyük fel, hogy egy data nevű file oszlopai 2től 101ig tartalmaznak animálandó függvényeket az első oszlop függvényében. Írjunk egy rajzolo.plt filét:
       c_p = c_p+1
       plot "$0" using 1:c_p with lines linetype 1
       if(c_p <  n_p) reread
És egy másikat, melyben ez áll:
       n_p=101
       c_p=1
       set nokey
       set yrange [0:10]
       call 'rajzolo.plt' 'data'

Animáció adatfileokból

Ha van egy mozi könyvtárban sok pl. psi.0001.norm nevu fileunk, ami pl. egy hullámfüggvény abszolút négyzetének időfejlődét arja le, akkor a következő scriptet használhatjuk a levetítésére.
#!/bin/bash
echo "#!/usr/bin/gnuplot" > mozi.plt
echo "set xrange [-5:5]" >> mozi.plt
echo "set yrange [0:1]" >> mozi.plt
for adatok in mozi/psi.*.norm
do
cim=`echo $adatok | cut -d"." -f2`
echo "p '$1' title `t=$cim` w l" >> ,mozi.plt
done
chmod +x mozi.plt
./mozi.plt
A scirpt példa a fileokon futó bash for ciklusra. Ilyenkor az $adatok változó tartalma minden ciklusmagban a soron következő filenév. A script cim=... sora kiveszi az első és második "." karakter közé tett karakterláncot a filenévből, ez kerül majd a plot címébe, hogy az animáció során állandóan követni lehessen a file időparaméterét.

Kép betolása jobbról

Próbáljuk ki az alábbi scriptet:
if (pi<3.1415928) set xrange[0:1]; set lmargin 3; set size 0.95,1
pi=pi+0.02 
a=pi-3.1415927                                                   
set origin 1-a,0                                                 
plot x notitle w l 1                                             
if (a<0.98) reread                                               
pause -1
A szokásos szervezésű ciklus rögzített méretű képet jelentet meg eltolt állapotban. Ami nem fér ki az ablakba, azt levágja.
Borsányi Szabolcs

  fizikus