Gnuplot howto oldal - Trükkök

Ebben a részben bemutatunk néhány egyéb kategóriás parancsot, illetve az emberélet megkönnyítésére szolgáló trükköket.

Amennyiben kérdésed van, hogyan lehet valamit megoldani, (valószínűleg!) az oldal szerzője utánanéz és válaszol. Ha pedig valami itt nem szereplő trükkre rájöttél és nagyon büszke vagy rá, ne habozz közzétenni.

Linux (shell) parancsok kiadása

Írjunk felkiáltójelet a parancs elé:
gnuplot> !ls
és máris ott az ls eredménye, meg egy felkiáltójel. Megjegyezzük, hogy ugyanez a módszer működik más programokban is, pl. az ftp-nél így lehet a helyi gépen kiadni parancsokat, ha pl. az lls nem működne.

Ideiglenes shell nyitása

Nem kell kiépni a gnuplotból ha gyorsan el akarunk intézni valamit a shellben, egyszerűen írjuk:
gnuplot> shell
majd a végén, ha befejeztük: exit.

Linux parancsok/programok eredményének helyettesítése gnuplot parancsba

Itt is működik (nem csak a shellben) a fordított aposztrof. Zárjuk két ilyen jel közé a linux parancsot a maga argumentumaival, pipe láncával együtt, és az egész fordított aposztrofos kifejezés értéke a parancs standard outputja lesz. Pl. a
gnuplot> print `echo $((1+1))`
2
gnuplot> print 1+1
2
sorok ugyanazt eredményezik. Sajnos, ha idézőjelbe tesszük a fordított aposztrofot, akkor a helyettesítő funkciója megszűnik:
gnuplot> print "`echo *`"
`echo *`
ahelyett, hogy az aktuális könyvtár tartalmát kiírná.

Képzetes részű függvények

A gnuplot akkor rajzolja ki az adott pontot, ha 10^-8-nál kisebb a képzetes része. Ezt a határt a
gnuplot> set zero 
paranccsal írhatjuk át.

Rövid intervallumok

Ugyancsak a set zero állította határszám határozza meg, hogy a legrövidebb engedélyezett x- vagy yrange mekkora lehessen. Kézzel nem tudunk ennél kisebbet beállítani, de általában nem is akarunk. De az autoscale beállíthatja ennél kisebbre, különösen, ha az adatunk egy nulla körüli 10^-9 amplitudójú zaj, vagy más kis függvény.
gnuplot> p [0:1] exp(-x-17)
vidáman működik, de a
gnuplot> p [0:1] exp(-x-18)
Warning: empty y range [5.6028e-09:1.523e-08], adjusting to [-1:1]
hibát jelez. Ezt feloldhatjuk:
gnuplot> set zero 10**(-9)
gnuplot> replot
Ekkor már látjuk az exponenciálist.

Pontosság beállítása

Nem mindig elegendő a pontosság a a cimkéknek:
gnuplot> p [0:1] 1+exp(-x-15)
Ekkor az y tengelyen csupa egyest látunk, bár a görbe szépen kirajzolódott. A kiírás pontosságát a set format segítségével módosíthatjuk, egészen úgy, mintha C környezetben tennénk:
gnuplot> set format y "%.10f" 
gnuplot> p [0:1] 1+exp(-x-15)
és most már azt látjuk, amit szeretnénk.

Teszt oldal

A terminal képességeit a test paranccsal ellenőrizhetjük. Ha postscirpt módban adjuk ki, akkor kinyomtatva hasznos táblázat válik belőle.
gnuplot> test

Beolvasás standard inputról

A gnuplot érti, ha '-' filenevet írunk be, ekkor a standard inputról kéri az adatot. Amikor billentyűzetről gépeljük, az e betű jelzi, hol az adatsor vége
gnuplot> reset; plot '-', '-' w l
1 1
2 3
3 5
e
1 1
2 4
# megjegyzés
3 9
e 

Alapállapot

A reset parancs alapállapotba hozza a programot.
gnuplot> reset

Furcsa karakterek, sortörés cimkékben

A duplaidézőjeles karakterláncokban a gnuplot felismeri a
\n   új sor
\r   bal felső csücsök jel
\t   N alatt L
\123 oktális szám
\\   \
Ez utóbbihoz lásd a karakterkódokat a postscript mód leírásánál. A többi kód nem ad semmi érdekest. Felhívjuk a figyelmet, hogy egyszeres idézőjelben mindez nem működik, hanem megjelenik úgy, ahogy beírtuk. Enhanced postscript tegyük a sortörést kapcsos zárójelek közé!

A vonalminta és egyéb jelölések méretezése

Előfordulhat, hogy a kimeneteti ábrafájlban a szagattott vonalak szaggatottságának mérete nem kielégítő, szeretnénk, ha jobban látható, nagyobb vonalminta jelenne meg. Ha a set size paranccsal lekicsinyíjük az ábrát, a betűméret és a vonalvastagság, szaggatásnagyság nem változik abszolút. Azaz nagyobb szaggatásmérethez vegyünk kisebb ábraméretet, kisebb cimkeméretet (lásd pl. set term post ... ), és majd a dokumentumba való beillesztéskor skálázzuk vissza nagyobbra. (Az ötletért köszönet Németh Zoltán Ádámnak és Koltai Jánosnak.)

TeX és LaTeX formázott cimkék

A postscript terminálon az enhanced postscript opciót bekapcsolva lehetőségünk van ravasz kódokat beírni, melyek gyakran kiválthatják a Latex kódolást. Ha mégis Latexre van szükségünk, javaslom a pstex ill. a pslatex terminálokat.

Multiplot ravaszságok

Egy ablakban több ábra

A következő script az ábra bal oldalába egy egyenest, a jobb oldalára egy felületet rajzol.
set multiplot    
set size 0.5,1
plot [0:1] x 
#set lmargin 30 
#set rmargin 20 
set origin 0.5,0
set size 0.5,1
splot [0:1][0:1] x*y
set nomultiplot

Különböző nagyságrendű görbék ábrázolása egy grafikonon - a bal- és jobboldali y tengely eltérő skálázása

Ha naívan kiküldünk két ábrát plottal, akkor mindegyikre ugyanaz az y tengely vonatkozik. Független ábraként kell megjeleníteni, ha független skálázást akarunk. Naívan multiplottal az lenne, hogy:
set xrange [0:1] 
set multiplot    
plot x notitle
plot sin(x)**10 notitle   
set nomultiplot
ekkor a két görbe egyszerre lesz jelen, külön skálázva és egymásbalógó ytengelyek jelennek meg. Randa, kusza.

Tegyük át a baloldalra a második görbe y tengelyét:

set xrange [0:1] 
set multiplot    
plot x notitle
set noytics
set y2tics
plot sin(x)**10 notitle
set nomultiplot
Az a baj, hogy még mindig nincs egymáson a két grafikon. Toljuk egymásra! A set lmargin és set rmargin azt mondja meg, hogy hány karakterre legyen az ablak szélétől (befele mérve) a tengely. Ha nem adjuk meg, mindkét ábra magának számolja, természetesen különbözőképpen. Ha azonban kikötjük az elején, minden ábra utána ahhoz igazodik:
set rmargin 6 
set lmargin 5
set xrange [0:1] 
set multiplot    
plot x notitle w l 1
set noytics
set y2tics
plot sin(x)**10 notitle w l 2
set nomultiplot
Még mindig nem jó: A jobboldali y tengelyen rajtamaradtak a baloldali y tengely rovátkái. Ezt a set ytics beálltás nomirror kapcsolójával szedhetjük le. A végleges forma:
set rmargin 6 
set lmargin 5
set xrange [0:1] 
set multiplot    
set ytics nomirror
plot x notitle w l 1
set noytics
set y2tics
plot sin(x)**10 notitle w l 2
set nomultiplot

Adattartomány kiválasztása

x-től független fit intervallum megadása

Erre kettő megoldást tudok. Az egyik, hogy az every paranccsal megadjuk, hogy mely sorokat akarjuk bevonni az illesztésbe:
gnuplot> fit 'file' every ::10::20 a+b*x+c*x*x via a,b,c
pl. a 11-iktől a 21-ig sorig veszi figyelembe a file adatsorait. Ez pl. akkor hasznos, ha a sorszám szerint egyenletesen változó 1. oszlop valamely intervallumba tartozó értékeihez tartozó 2:3 pontpárokra akarunk illeszteni, vagy őket akarjuk ábrázolni. Pl. ha 0.1-esével megy az 1. oszlop nullától akkor a 10 és 20 közötti paraméterértékekhez tartozó görbepontok (pl. 2-es és 3-as oszlop) illesztése minden második pont kihajításával:
gnuplot> fit 'file' every 2::100::200 a+b*x via a,b
A másik megoldás hack jellegű, íme:

Paramétertől függő fit intervallum megadása

A hack-megoldás, az, hogy először kiírjuk egy fileba a megfelelő pontokat, majd, visszaolvasva értelmezzük. Legyen egy 'file' fileban az 1. oszlop a paraméter, a 2. és a 3. oszlop pedig a görbe x és y pontjai. Ha ezen paraméter 10 és 20 közötti értékénél akarunk illeszteni, írjuk ezt (ilyenkor már kezd érdemes lenni scriptet írni):
set term table
set output 'file1'
splot [10:20] 'file_orig' 1:2:3
! grep i file_1 > file_2
set term x11
set out
fit 'file_2' u 2:3 a+b*x via a,b
A set term table hatására a kimenet szöveges lesz, a set output-tal megadott file. (Set output hiányában a konzolra ír.) Ha most plot-ot használunk, akkor két oszlop kiiratására van lehetőség, ha splot-ot, akkor három. A jelen esetben 3 adatoszlop után egy betű is lesz minden sor végén a file1 fileban, ez o, ha a pont a tartományon kívül esik, és i, ha belül van, u pedig, ha nem definiált a pont. (A set table sok esetben jo, hiszen a using módosító segítségével oszlopon végrehajott műveleteket, vagy a set contour -ral létrehozott kontúrokat ilymódon menthetjük el.) A felkiáltójel külső programot hív, a grep kiválasztja az i-t tartalmazó sorokat, azaz azokat, akik az intervallumban vannak, őket egy új fileba írva a leszűkített adatfile előállt.
Borsányi Szabolcs

  fizikus