čtvrtek 25. února 2010

Hrátky s Gnuplotem

Před pár dny za mnou přišla má přítelkyně s tím, že potřebuje poradit s nějakým grafem. Řeknete si pche nějaký hloupý graf přece nemůže být problém. No tak to je přesně to, co mi v tu chvíli proběhlo hlavou.

Ukázala mi tabulku s jakýmisi hodnotami s tím, že v excelu je to na jedno kliknutí. Zde možná stojí za zmínku, že přítelkyně je šťastným uživatelem Ubuntu linuxu a na nějaký "Excel" už jistě dávno zapomněla. Bohužel už si nevybavím to šílené slovo kterým ten druh grafu titulovala, každopádně v Excelu se to prý jmenuje povrchový graf.

Jelikož sám nejsem zrovna nadšeným příznivcem molochů, jako je OpenOffice, či Microsoft Office, osobně raděli LaTeX stálo mně to chvilku hledání a následně i googlení, abych zjistil, že takový graf zřejmě OpenOffice neumí (pokud ano prosím podělte se se mnou).

No co řekl jsem si, když něco potřebuješ obrať se na profíka. A tak jsem se začal přehrabovat v dokumentaci Gnuplotu :). Jelikož nejsem ani žádný nadšený grafista chvíli mi trvalo, než jsem se dopracoval k něčemu o čem byla přítelkyně ochotná prohlásit že to je přibližně ono - docela úspěch na to, že jediné co jsem o tom grafu věděl byla vstupní data.

Mějme tedy vstupní data v podobě matice 10x10. V tomto případě se jedná pouze o náhodná data.

26502 17800 19489 28724 10661 5578 22339 26876 16096 17132 21579
1277 2745 28030 30732 29398 6996 27581 22413 7083 5514 22908
6020 8953 18124 15056 6036 5914 30910 7550 5445 7831 25231
25893 711 11825 21530 11819 3430 5038 30398 29545 4045 24932
16382 25238 27643 1671 29143 2932 2309 8242 17637 21948 28816
20278 6196 27082 18445 7846 17127 30729 8627 18207 25483 2844
24894 23256 18744 20690 12393 9837 21101 1479 16172 21099 23977
28633 19381 4506 10185 4945 11816 26638 13349 3790 25623 22252
6761 18929 22464 30973 22067 25290 24329 23540 29809 1541 11836
8831 14968 7636 14978 15120 8933 924 18465 14184 19508 8287
8309 4328 13602 10220 11184 26007 25282 23240 27217 31218 19553

Z těchto dat, dokáže Gnuplot vygenerovat vcelku pěkný 3D obrázek. Co jsem ale já, resp. moje přítelkyně, potřeboval, byl 2D obrázek zachycující kontury onoho 3D objektu jakoby rozsekaného do několika pásem (v z-ové ose, na níž se nanášejí právě ty hodnoty z matice).

Pro lepší pochopení si představte, že uvedená matice představuje výšky hor v pohoří a to co jsem já potřeboval je mapa s vrstevnicemi. To už se představit dá ne?

Takže asi následovně. Nejdříve bude třeba s matice vytvořit data, se kterými bude moci gnuplot pohodlně pracovat. Teda, ne že by to s maticí neuměl, ale pokud budeme chtít do grafu vykreslit obojí, bude Gnuplot protestovat.

set xrange [0:10]; set yrange [0:10]
set size ratio 1
set table 'gnuplot.data'
splot 'data' matrix
unset table

Tímto si gnuplot vytvoří z matice uložené v souboru data přijatelnější formát a uloží jej do souboru test.dat. Ostatní snad nemusím vysvětlovat, jen podotknu, že nastavení poměru je důležité, jelikož gnuplot z nějakého důvodu nepředpokládá čtvercová data a obrázek by tak byl zkreslený do obdélníku. Následuje ta důležitější část a co vytvoření dat pro ony zmiňované vrstevnice

set contour base
set cntrparam bspline
unset surface
set table 'gnuplot.cont'
splot 'data' matrix
unset table

Potřebné vysvětlení najdete v manuálu, protože jsem trošku lenivý to tady rozepisovat :). Snad jen zmíním, že v tomto příkladu jsem použil pro vykreslení kontur bspline, jelikož dat je málo a zaoblené to vypadá lépe. Jakmile máme data připravena můžeme graf vykreslit.

set terminal png
set output 'plot.png'
p 'gnuplot.data' with image, 'gnuplot.cont' w l lt -1 lw 1.5
# p 'cont.dat' w l lt -1 lw 1.5
# p 'test.dat' with image

Zakomentované řádky jsou jenom jednotlivé části (data a kontury) samostatně. A zde už je výsledek

Není to nic moc, což je asi taky důvod proč se rozhodla použít obrázek od kamarádky :(. Mimochodem, pokud místo dat použijete například nějakou pěknou funkci, vypadá to vážně moc dobře, viz. obrázek na začátku článku. Jde vlastně hlavně o to, že se mi nepodařilo přijít na to, jak vyplnit prostor, který kontury ohraničují nějakou barvou...snad příště. Pokud se najde nějaký gnuplotí odborník, který jednoduše Ví, prosím neváhejte a podělte se v komentáři.

Každopádně mně ale mrzí, že něco takového OpenOffice neumožňuje, nakonec, jak moc to může být složité? Asi jim napíšu feature request.

Zajímavé odkazy

Žádné komentáře:

Okomentovat