Gnuplot

Z GeoWikiCZ

Gnuplot je interaktivní řádkový program pro kreslení 2D a 3D grafů funkcí a vizualizaci dat. Program byl původně určen pro vědeckou a studentskou vizualizaci matematických funkcí a dat. Program slouží také pro neinteraktivní užití ve skriptech pro web a jako vizualizační nástroj pro ostatní programy jako např. GNU Octave.

Domovská stránka projektu: http://www.gnuplot.info
Odkazy na literaturu:

Oficiální dokumentace aktuální verze (PDF)
Kawano - Gnuplot Tips (Not so Frequently Asked Questions)
Josef Doboš: Gnuplot

Zobrazení souřadnic bodů v S-JTSK

Nastavení os, měřítka a popisu

  • zobrazení rámečku grafu se ovládá příkazem set border x, kde x udává součet čísel jednotlivých čar rámečku, které se mají zobrazit. Spodní čára má číslo 1, levá 2, horní 4 a pravá 8.
set border 12
  • nastavení velikosti okrajů okolo rámečku se provádí příkazem set xmargin y, kde x je označení okraje: l pro levý okraj, p pro pravý, t pro horní okraj a b pro spodní. y označuje velikost okraje v jednotkách velikosti znaku použitého fontu terminálu. Do okraje se umisťuje stupnice os, její popis a titulek grafu.
set lmargin 2
set rmargin 8
set tmargin 8
set bmargin 2
  • stupnice na osách se ovládá funkcí set otics i, kde o je označení osy a i je velikost dílku osy. Spodní čára rámečku je označena jako osa x, levá čára rámečku jako osa y, horní a pravá čára jako osy x2 a y2. Standartně je zobrazeno dělení na ose x a y s tím, že je nastaven parametr mirror, který provádí zrcadlení dělení na protějších osách. Zrcadlení se vypíná volbou nomirror. Zobrazené dělení je možné vypnout příkazem unset otics. Otočení popisu dílků osy se provádí volbou rotate u, kde u je úhel rotace ve stupních. Kromně hlavního dělení stupnice je možné zobrazit ještě pomocné dělení, které se nepopisuje číly. Zobrazení tohoto dělení se provádí příkazem set motics p, kde o je označení osy a p počet dílků vedlejší stupnice na dílek v hlavní stupnici.
unset xtics
unset ytics
set x2tics 100 rotate by 90
set y2tics 100
set mx2tics 5
set my2tics 5
  • formát popisu stupnice se ovládá příkazem set format o "ret", kde o je označení osy a ret je formátovací řetězec příkazu printf jazyka C.
set format x2 "%.0f"
set format y2 "%.0f"
  • interval zobrazovaný na osách se nastavuje příkazem set orange [min:max], kde o je označení osy. Přepínačem reverse je možné obrátit směr číslování na ose.
x_min = 1039000
x_max = 1043000
y_min =  744000
y_max =  746000
set y2range [x_min:x_max] reverse ## na osu y2 vynášíme souřadnici x
set x2range [y_min:y_max] reverse
  • velikost grafu a měřítko na osách se ovládá funkcí set size a,b ratio c, kde a,b jsou poměry velikosti rámečku (os) grafu k velikosti terminálu (okno). Parametr c udává poměr šířky a výšky rámečku. Jednička nastavuje čtverec. Záporná hodnota parametru c má odlišný význam. Udává poměr měřítek os x a y. Když c=-1 je nastaveno stejné měřítko pro x-ovou i y-ovou osu.
set size 1,1 ratio -1
  • popis os, nadpis, legenda čar a mřížka se zapíná příkazy set příkaz a vypíná příkazy unset příkaz. Příkazem font "jmeno_fontu,velikost" je možné měnit typ a velikost fontu.
set title "Body v S-JTSK" font ",20"
set x2label "Y-ová souřadnice"
set y2label "X-ová souřadnice"
unset key   # legenda
unset grid  # mřížka

Vykreslení bodů s popisem

se může provést příkazem set label "název bodu" at sour_x,sour_y offset odsazení_x,odsazení_y point styl_bodu, kde název bodu je řetězec, který se umístí na zadané souřadnice sour_x,sour_y. Parametrem offset nastavuje odsazení popisu od značky bodu, jejíž styl se nastavuje parametrem styl_bodu. Tento parametr může mít tvar linetype t1 pointtype t2 pointsize t3, kde linetype t1 určuje číslem t1 typ čáry, pointtype t2 určuje typ značky na bodu a pointsize t3 určuje velikost značky jako násobek standartní velikosti značky. Čísla přiřazená k jednotlivým barvám a typům značek získáme zadáním příkazu test. Barvy a typy značek mohou být pro různé terminály (výstupní zařízení - x11, postscript, png, ...) odlišné.

x1 = 1039747.32; y1 = 745528.16 ## kostel sv. Matěje
x2 = 1042459.18; y2 = 744233.46 ## chrám sv. Víta
offset_x =  0.01
offset_y = -0.01
set label "Matěj" at second y1,x1 point pt 6 lt 0 ps 1 offset graph offset_x,offset_y
set label "Vít"   at second y2,x2 point pt 6 lt 0 ps 1 offset graph offset_x,offset_y

Gnuplot definuje několik souřadnicových systémů:

first     ... osy x, y
second    ... osy x2, y2
graph     ... levý dolní roh rámečku má souřadnice [0,0] a pravý horní roh [1,1]
screen    ... stejné jako graph s tím, že se vztahují na celé okno
character ... velikost je udávána vzhledem k velikosti aktuálního fontu terminálu

Vykreslení úsečky nebo vektoru

Úsečku je možné vykreslit dvěma způsoby. První využívá standartního způsobu zobrazení dat z datového souboru, a druhý, jednodušší používá příkaz pro vykreslení vektoru set arrow.

set multiplot  # nastavuje mód kreslení více grafů do jednoho okna
               # chceme-li kreslit více čar do jednoho grafu,
               # nakreslíme několik grafů s jednotlivými čarami
               # a umístíme je přes sebe - musíme proto nastavit
               # rozsahy os funkci set x2range a y2range, aby měli
               # všechny grafy stejnou velikost
plot '-' axes x2y2 with lines linetype 2
745528.16 1039747.32
744233.46 1042459.18
eof

nebo

set arrow from second y1,x1 to second y2,x2 nohead lt 2

Vykreslení elipsy chyb

je možné provést parametrickým vykreslením elipsy v polárních souřadnicích otočených lineární transformací. Tato konstrukce už je poněkud delší a pro vykreslování více elips je vhodné si uložit kód pro její vykreslování do zvláštního souboru např. elipsa.gpi a používat ho jako funkci s pozičními parametry $0 $1 $2 $3 $4. Maximální počet pozičních parametrů je v Gnuplotu stanoven na 10.

## soubor elipsa.gpi
## $0, $1 ... poloosy elipsy a b
## $2     ... úhel stočení v radiánech 
## $3, $4 ... souřadnice středu elipsy x, y
set parametric
set dummy t
# převod polárních souřadnic na pravoúhlé
fx(t)  =  $0*cos(t)
fy(t)  =  $1*sin(t)
# lineární transformace
fxx(t) = fx(t)*cos($2) - fy(t)*sin($2) + $3
fyy(t) = fx(t)*sin($2) + fy(t)*cos($2) + $4
set sample 40 ## počet bodů pro vykreslení elipsy
plot [0:2*pi] fyy(t), fxx(t) axes x2y2
unset parametric

Volání takto napsané funkce se provádí příkazem call.

m  = 300 # měřítko - zvětšení elipsy
a1 = m*2; b1 = m*1; om1 =  pi/8  # poloosy elipsy a úhel stočení
a2 = m*3; b2 = m*1; om2 = -pi/8
call 'elipsa.gpi' a1 b1 om1 x1 y1
call 'elipsa.gpi' a2 b2 om2 x2 y2

Výstupní zařízení - terminály

Gnuplot nabízí téměř 80 terminálů (formátů) ve kterých zobrazuje výsledky vizualizace. Standartním terminál na linuxu je x11, který zobrazuje grafy v grafickém okně. Pro tisk grafu je vhodné použít např. terminál postscript, pdf, png nebo jpeg. Pro vložení grafu do dokumentu v LaTeXu slouží např. terminály latex, eepic, pstricks, pslatex nebo tpic. Pro další zpracování grafů v programech např. CorelDraw, QCAD, Xfig nebo Grass je možné použít terminály corel, dxf, fig a grass.

Vzhledem k tomu, že jsou výstupní termilály velice rozmanité, je výsledný vzhled grafu závislý na typu terminálu. Nejčastěji se u jednotlivých terminálů odlišují typy čar, barvy, symboly a fonty.

Příkazem set output "jméno_souboru" je možné přesměrovat výstup do souboru. Příkazem set encoding iso_8859_2 je možné nastavit kódování znakové sady. Terminály mají mnoho různých voleb, které jsou popsány v oficiální dokumentaci. Přehled všech terminálů získáme příkazem set terminal.

Poznámky k verzím

Ve verzi 4.0 nefunguje:

  • parametr rotate u příkazu set xtics
  • specifikace souřadného systému graph, screen a character (funguje pouze first a second)

Shrnutí

## hlavní skript
## --------------
## * vykreslení bodů v S-JTSK
## * vykreslení elips chyb
## * vykreslení úseček
## --------------

## Author: Tomáš Kubín
## Lincense: GPL

## terminál
#set terminal png size 800,600
#set output "graf.png"
#set terminal postscript eps size 13cm,13cm font 15
#set output "graf.eps"

## rámeček - border
##     4
##    ---
## 2 |   | 8
##    ---
##     1
set border 12

## velikosti okrajů okolo rámečku 
## v jednotkách velikosti fontu terminálu
##     t
##    ---
## l |   | r
##    ---
##     b
set lmargin 2
set bmargin 2
set rmargin 8
set tmargin 8

## stupnice na osách
##     x2
##    ---
## y |   | y2
##    ---
##     x
unset xtics
unset ytics
set x2tics 1000 rotate by 90
set y2tics 1000

## drobnější dělení na osách
set mx2tics 5
set my2tics 5

## formát čísel na osách a orientace
set format x2 "%.0f"
set format y2 "%.0f"

## rozsah os
x_min = 1039000
x_max = 1043000
y_min =  743000
y_max =  747000
set y2range [x_min:x_max] reverse
set x2range [y_min:y_max] reverse

## velikost grafu
#set size 1,1 ratio -1

## popis os
set title "Body v S-JTSK" font ",20"
set x2label "Y-ová souřadnice"
set y2label "X-ová souřadnice"

## grid
unset grid

## popis čar grafu - legenda
unset key

## body a jejich cisla
x1 = 1039747.32; y1 = 745528.16 ## kostel sv. Matěje
x2 = 1042459.18; y2 = 744233.46 ## chrám sv. Víta
offset_x =  0.01
offset_y = -0.01
set label "Matěj" at second y1,x1 point pt 6 lt 0 ps 1 offset graph offset_x,offset_y
set label "Vít"   at second y2,x2 point pt 6 lt 0 ps 1 offset graph offset_x,offset_y

## více grafů na jeden list
set multiplot 

## vykreslení úsečky - datový soubor
plot '-' axes x2y2 with lines lt 2
745528.16 1039747.32
744233.46 1042459.18
eof

## vykreslení úsečky - příkaz set arrow
set arrow from second y1,x1 to second y2,x2 nohead lt 2

## vykreslení elipsy
## a b ... poloosy elipsy
## om  ... úhel stočení
## m   ... měřítko zvětšení elipsy
m = 300
a1 = m*2; b1 = m*1; om1 = pi/8
a2 = m*3; b2 = m*1; om2 = -pi/8
call "elipsa.gpi" a1 b1 om1 x1 y1
call "elipsa.gpi" a2 b2 om2 x2 y2

unset multiplot

pause -1
## funkce elipsa.gpi
## vykresleni elipsy
## $0 $1 ... poloosy a b
## $2    ... uhel stočení v radiánech 
## $3 $4 ... souřadnice středu x y

## Author: Tomáš Kubín
## Lincense: GPL

set parametric 
set dummy t
# převod polárních souřadnic na pravoúhlé
fx(t)  =  $0*cos(t)
fy(t)  =  $1*sin(t)
# lineární transformace
fxx(t) = fx(t)*cos($2) - fy(t)*sin($2) + $3
fyy(t) = fx(t)*sin($2) + fy(t)*cos($2) + $4
set sample 40 ## počet bodů pro vykreslení elipsy
plot [0:2*pi] fyy(t), fxx(t) axes x2y2
unset parametric