Obsah
1. Jednoduché grafy vytvořené z externích dat
2. Jednorozměrné grafy
3. Specifikace x-ové i y-ové souřadnice bodů grafu
4. Styly vykreslovaného grafu
4.1 Propojení bodů pomocí lomené čáry (polyčáry)
4.2 Zobrazení jednotlivých bodů
4.3 Zobrazení digitalizovaných signálů pomocí „schodovité“ funkce
4.4 Zvýraznění bodů, které jsou propojeny lomenou čarou (polyčarou)
4.5 Impulsy začínající na x-ové ose
4.6 Sloupcový graf
5. Jednorozměrné grafy a chybové hodnoty
6. Volba výstupního grafického zařízení
7. Obsah dalšího pokračování tohoto seriálu
1. Grafy vytvořené z externích dat
V předchozí části tohoto seriálu jsme si kromě uvedení základních informací o aplikaci gnuplot ukázali i tvorbu jednorozměrných grafů funkcí jedné nezávislé a jedné závislé proměnné, přičemž vykreslované funkce byly zadány přímo svým vzorcem, například zápisem plot sin(x)/x či plot sin(x)/(x**2+1) (onou nezávislou proměnnou je v těchto případech proměnná x). Schopnosti gnuplotu jsou v této oblasti opravdu velké a nepřímo tak ukazují sílu vestavěného skriptovacího jazyka, který se snaží být konzistentní jak s programovacím jazykem C, tak i s dalšími programovacími jazyky, například Fortranem či Basicem. Avšak gnuplot disponuje i další velmi užitečnou funkcionalitou – schopností zobrazit jednorozměrné i dvojrozměrné grafy sestrojené na základě dodaných numerických hodnot uložených v externích (většinou textových – ASCII) souborech a/nebo hodnot načtených ze standardního vstupu.
V tomto případě gnuplot vlastně funguje jako souborový či datový filtr, který ze vstupu načítá numerická data a na výstup posílá vektorový nebo rastrový obrázek představující vytvořený graf, popř. graf zobrazuje na zvoleném grafickém zařízení, například v okně systému X Window. Gnuplot může tvořit doplněk k dříve popisovanému tabulkovému procesoru sc, který sám o sobě grafický výstup neimplementuje – ostatně největší síla Unixu spočívá právě v cílené kombinaci více jednoúčelových nástrojů. S pomocí externích skriptů volajících gnuplot či příkazů zapsaných v interním skriptovacím jazyce je dokonce možné provést jednoduchou animaci průběhu funkce, například v závislosti na nějaké průběžně se měnící vstupní podmínce ovlivňující hodnotu jediné nezávislé proměnné. Sérii vytvořených snímků sice gnuplot do animace sám spojit neumí, ale je možné použít další utility a vyrobit například animovaný GIF či video ve formátu MPEG.
V dalších kapitolách si ukážeme, jakým způsobem je možné v gnuplotu načítat data uložená v externích souborech a tvořit z těchto dat přehledné grafy. Základem je vytvoření jednorozměrného grafu, což je vysvětleno ve druhé kapitole. Ve třetí kapitole si ukážeme použití externích souborů obsahujících x-ové i y-ové souřadnice bodů. V mnoha případech je nutné ovlivnit způsob vykreslení grafů a popř. do grafu přidat i odchylky či chybové hodnoty – to je vysvětleno ve čtvrté a páté kapitole. Nakonec si ještě v šesté kapitole ukážeme, jakým způsobem je možné zvolit výstupní grafické zařízení nebo výstupní soubor, do kterého se bude provádět vykreslení grafu.
2. Jednorozměrné grafy
Jak jsme se již stručně zmínili v předchozí kapitole, představuje tvorba jednorozměrného grafu sestrojeného z hodnot uložených v externích souborech, základ pro naučení a používání dalších složitějších operací, například tvorby dvojrozměrných grafů nebo grafů vykreslujících vektorová pole. Externí soubory, ve kterých jsou numerická data uložena, nemusí mít nějakou speciální předem předepsanou strukturu. Právě naopak, pomocí poměrně jednoduché syntaxe (příkazem using) se gnuplot nakonfiguruje přesně podle struktury konkrétního souboru, takže je možné zpracovat data vytvořená například v dříve popsaném tabulkovém procesoru sc. V podstatě je „pouze“ nutné specifikovat, které numerické hodnoty je potřeba ze souboru načíst a v jakém formátu se mají tyto údaje načítat. Gnuplot poté automaticky provede všechny potřebné konverze dat, data načte, zpracuje a následně vytvoří (tj. vykreslí či uloží do rastrového či vektorového souboru) požadovaný graf. Ukažme si tedy jednoduchý příklad, pomocí kterého je vykreslen graf sestrojený z několika hodnot uložených v textovém souboru; tento příklad budeme postupně rozšiřovat o další možnosti a funkcionalitu.
Úplně nejjednodušší příklad načte numerické hodnoty z textového souboru, kde tyto hodnoty mohou být uloženy například systémem co hodnota, to jeden textový řádek. V případě jednorozměrných grafů může být na každém textovém řádku uložena buď jedna hodnota nebo hodnoty dvě. Pokud je na řádku uložena pouze jedna hodnota, je chápána jako y-ová souřadnice bodu, x-ovou souřadnici doplní gnuplot automaticky (předpokládá se, že za sebou jdoucí hodnoty jsou tímto způsobem uloženy i v externím souboru). V případě, že jsou na řádku uloženy hodnoty dvě, chápe gnuplot první hodnotu jako x-ovou souřadnici bodu a hodnotu druhou jako y-ovou souřadnici. Existují i další možnosti uložení dat, které se využijí například tehdy, když je zapotřebí vykreslit hodnoty a k nim příslušející vypočtené či naměřené chyby (ty je zapotřebí uložit vedle samotných hodnot – viz pátou kapitolu). Všechny zadané body se při tvorbě grafu v tom nejjednodušším případě pouze vykreslí pomocí malých kroužků a tímto způsobem jsou následně zobrazeny. Příkaz provádějící načtení hodnot z textového souboru „1.txt“ a následné vytvoření grafu bude mít tento tvar:
plot "1.txt"
Soubor „1.txt“ byl získán následujícím programem napsaným s využitím programovacího jazyka C:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(void)
{
float x, y;
for (x=0.1; x<25.0; x+=0.1) {
y=sin(x)/x;
printf("%5.3f\n", y);
}
return 0;
}
Vytvořený soubor, který byl získán přesměrováním standardního výstupního proudu pomocí prostředků shellu, má tento obsah:
0.998
0.993
0.985
0.974
...
... dalších cca dvě stě řádků s čísly
...
-0.033
-0.030
-0.027
-0.024
-0.021
-0.017
-0.013
-0.009
Po spuštění gnuplotu a provedení příkazu plot „1.txt“ se na implicitně nastavené grafické zařízení vykreslí graf, který může vypadat například podobně jako graf zobrazený na prvním obrázku. Přesný tvar grafu je ovšem závislý na rozlišení výsledného zařízení a na jeho grafických schopnostech, například na možnostech práce s barvami či podpoře ditheringu a antialiasingu. Všechny následující obrázky byly získány ze screenshotu grafického okna X Window systému. Nastavení grafického zařízení bylo provedeno příkazem:
set term x11
Bližší informace o nastavení výstupního zařízení budou uvedeny v šesté kapitole.
Obrázek 1: Graf získaný z bodů uložených v externím souboru „1.txt“, ve kterém jsou specifikovány pouze jejich x-ové souřadnice
3. Specifikace x-ové i y-ové souřadnice bodů grafu
Všimněte si, že při kresbě prvního grafu nemohl gnuplot žádným způsobem zjistit x-ové souřadnice vykreslovaných bodů, protože v externím souboru byly uloženy pouze y-ové hodnoty (řídicí proměnná smyčky nebyla tištěna a tím pádem ani nemohla být přesměrována do externího souboru). Z tohoto důvodu se x-ové souřadnice před vykreslením grafu automaticky dopočítaly, a to tak, že každý následující bod měl x-ovou souřadnici o jednotku větší než bod předchozí. Pokud bychom požadovali, aby se korektně zobrazily i x-ové souřadnice, musel by se program pro tvorbu dat upravit následujícím způsobem:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(void)
{
float x, y;
for (x=0.1; x<25.0; x+=0.1) {
y=sin(x)/x;
printf("%5.3f %5.3f\n", x, y);
}
return 0;
}
Jak je z výše uvedeného výpisu kódu zřejmé, úprava spočívá ve vytištění jak řídicí proměnné smyčky x, tak i hodnoty proměnné y. Graf získaný z takto vytvořených dat je zobrazený na druhém obrázku. Všimněte si, že nyní již je popis x-ové osy korektní, protože se na ní vyskytují hodnoty z intervalu (0..25) a nikoli hodnoty z automaticky vytvořeného intervalu (0..250), jak tomu bylo u předchozího grafu.
Obrázek 2: Graf získaný z bodů uložených v externím souboru „1.txt“, ve kterém jsou uloženy jak x-ové, tak i y-ové souřadnice
4. Styly vykreslovaného grafu
Pokud by nám nevyhovoval způsob kreslení jednotlivých bodů, ze kterých se graf skládá, pomocí malých křížků, je možné při kresbě grafu zadat specifikátor stylu kreslení – ten rozšiřuje možnosti příkazu plot. Existuje více stylů, všechny si ukážeme na obrázcích, přičemž u každého popisu stylu bude uveden i příslušný příkaz, který vedl k tvorbě grafu. Na následujících screenshotech si všimněte, že v pravém horním rohu každého grafu je pomocí značky ukázáno, jaký styl (a mimo jiné také barva) je pro daný průběh funkce použit. To je výhodné zejména při slučování více průběhů funkcí do jednoho grafu.
4.1 Propojení bodů pomocí lomené čáry (polyčáry)
Patrně nejpoužívanějším stylem používaným pro vykreslení jednorozměrného grafu je propojení jednotlivých bodů pomocí lomené čáry (polyčáry). Při dostatečně velké hustotě bodů, resp. při jejich malé vzájemné vzdálenosti, se lomená čára opticky vyhladí a vznikne dojem hladkého průběhu funkce – samozřejmě za předpokladu, že je i průběh funkce hladký a nejsou v něm například skoky. Graf se vykreslí pomocí lomené čáry po zadání příkazu:
plot "1.txt" with lines
Výsledný graf vzniklý po provedení tohoto příkazu je zobrazen na třetím obrázku.
Obrázek 3: Graf funkce vykreslený pomocí lomené čáry (polyčáry)
4.2 Zobrazení jednotlivých bodů
V případě, že je hustota bodů ve vykreslovaném grafu příliš velká (v některých případech může jít i o desetitisíce bodů umístěných v jednom grafu), může být výhodné každý bod vykreslit pomocí velmi malé značky. Na obrazovce se typicky jedná o jeden jediný pixel a na tiskárně o nejmenší viditelnou stopu, která je však většinou větší než nejmenší tiskový bod. I takového efektu, který je mimo jiné ukázán na čtvrtém obrázku, je v gnuplotu samozřejmě možné dosáhnout, stačí použít příkaz:
plot "1.txt" with dots
Obrázek 4: Graf funkce vykreslený pomocí jednotlivých bodů (pixelů)
4.3 Zobrazení digitalizovaných signálů pomocí „schodovité“ funkce
Dále je možné zvýraznit jednotlivé hodnoty v grafu tak, že se neprovede propojení zadaných bodů pomocí lomené čáry, ale vytvoří se „schody“ mezi jednotlivými body. V některých případech, zejména při zobrazování digitalizovaných resp. diskretizovaných signálů je tento způsob nejbližší realitě. Příkaz pro tvorbu tohoto stylu grafu je velmi jednoduchý:
plot "1.txt" with steps
Obrázek 5: Graf „schodovité“ funkce
4.4 Zvýraznění bodů, které jsou propojeny lomenou čarou (polyčarou)
Pokud si přejeme zvýraznit jednotlivé zadané body, ale přitom tyto body současně navzájem propojit lomenou čarou (polyčarou), je možné použít příkaz:
plot "1.txt" with linespoints
Výsledkem je graf, který vlastně spojuje vlastnosti grafu získaného příkazem plot „1.txt“ a plot „1.txt“ with lines.
Obrázek 6: Graf funkce se zobrazenými body, které jsou propojeny lomenou čarou
4.5 Impulsy začínající na x-ové ose
Velmi ilustrativní může být v některých případech graf, ve kterém jednotlivé hodnoty představují impulsy začínající na x-ové ose. Příklad takového grafu je zobrazen na sedmém obrázku a příkaz, kterým byl graf vytvořen, má tvar:
plot "1.txt" with impulses
Obrázek 7: Graf funkce zobrazený pomocí impulsů
4.6 Sloupcový graf
Posledním typem grafu jedné nezávislé proměnné je graf sloupcový. Tento typ grafu je typicky používán v těch případech, kdy je zapotřebí zobrazit pouze malé množství hodnot, například výdaje firmy v jednotlivých měsících (celkem dvanáct hodnot) apod. Příkaz pro tvorbu sloupcového grafu má tvar:
plot "1.txt" with boxes
Obrázek 8: Sloupcový graf
5. Jednorozměrné grafy a chybové hodnoty
Při výpočtu či měření některých veličin se můžeme dopustit předem známé chyby nebo připouštíme určitý rozkmit hodnot. Pro účely zobrazení chybových hodnot (resp. rozptylu hodnot od hodnoty vykreslené) používá gnutplot rozšířený soubor s uloženými numerickými hodnotami. Na každém řádku vstupního textového souboru se nachází tři, čtyři nebo dokonce šest hodnot s následujícím významem:
- x, y, ydelta – x-ová hodnota, y-ová hodnota a symetrický rozptyl y-ové hodnoty
- x, y, ylow, yhigh – x-ová hodnota, y-ová hodnota, nejnižší možná a nejvyšší možná y-ová hodnota
- x, y, xdelta – x-ová hodnota, y-ová hodnota a symetrický rozptyl x-ové hodnoty
- x, y, xlow, xhigh – x-ová hodnota, y-ová hodnota, nejnižší možná a nejvyšší možná x-ová hodnota
- x, y, xdelta, ydelta – x-ová hodnota, y-ová hodnota, symetrický rozptyl x-ové hodnoty a symetrický rozptyl y-ové hodnoty
- x, y, xlow, xhigh, ylow, yhigh – x-ová hodnota, y-ová hodnota, nejnižší možná a nejvyšší možná x-ová hodnota, nejnižší možná a nejvyšší možná y-ová hodnota
Všimněte si, že ve všech případech musí být zadána i x-ová hodnota bodu, není tedy možné použít zjednodušený formát bez této hodnoty. Je to logické, protože jinak by gnuplot nedokázal rozpoznat, kde začínají a kde končí souřadnice bodů a kde naopak začínají údaje o chybových hodnotách. Následující céčkový program slouží k vytvoření souboru obsahující na každém řádku tři hodnoty, tj. bude možné použít formáty x, y, ydelta a x, y, xdelta:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(void)
{
float x, y;
float delta;
for (x=0.1; x<25.0; x+=0.2) {
y=sin(x)/x;
delta=cos(x)/(x-10)/10.0f;
// orezat maxima a minima
if (delta>1.0f) delta=1.0f;
if (delta<-1.0f) delta=-1.0f;
printf("%5.3f %5.3f %6.4f\n", x, y, delta);
}
return 0;
}
Po přesměrování výstupu do souboru vznikne soubor obsahující následující řádky:
0.100 0.998 -0.0101
0.300 0.985 -0.0098
0.500 0.959 -0.0092
0.700 0.920 -0.0082
0.900 0.870 -0.0068
1.100 0.810 -0.0051
...
... dalších sto řádků s číselnými hodnotami
...
23.500 -0.042 -0.0005
23.700 -0.042 0.0010
23.900 -0.039 0.0024
24.100 -0.036 0.0036
24.300 -0.030 0.0047
24.500 -0.024 0.0056
24.700 -0.017 0.0062
24.900 -0.009 0.0065
S takto vytvořeným souborem je možné nakládat více způsoby. Po zadání příkazu:
plot "1.txt" with yerrorbard
Se zobrazí graf, na kterém jsou kromě vlastního průběhu funkce zvýrazněny i odchylky od y-ové hodnoty. Tyto odchylky jsou přečteny z třetího sloupce souboru.
Obrázek 9: Graf funkce zobrazený pomocí spolu s odchylkami y-ových hodnot
Třetí hodnotu na řádku v souboru je možné také chápat jako x-ovou odchylku, která se zobrazí pomocí příkazu:
plot "1.txt" with xerrorbard
Výsledek je zobrazený na desátém obrázku, všimněte si také použití jiného měřítka odchylek, než tomu bylo v případě grafu zobrazeného na devátém obrázku.
Obrázek 10: Graf funkce zobrazený pomocí spolu s odchylkami x-ových hodnot
6. Volba výstupního grafického zařízení
Při práci s gnuplotem, zejména při dávkovém zpracování mnoha numerických dat, je velmi důležité nastavení výstupního grafického zařízení nebo výstupního souboru, který bude obsahovat rastrová nebo vektorová data reprezentující vykreslený graf. Pro nastavení výstupu slouží příkaz set terminal, také je možné použít zkrácený příkaz set term. V následující tabulce jsem se pokusil vyjmenovat nejpoužívanější a nejužitečnější výstupní grafická zařízení resp. formáty výstupních souborů, které je možné použít pro uložení grafu. Je samozřejmé, že některé typy výstupů pracují pouze při splnění určitých hardwarových a softwarových podmínek, například při spuštěném systému X Window.
Grafický výstup | Příkaz pro nastavení výstupu | Typ grafiky |
---|---|---|
Formát Adobe Illustratoru 3.0 | set terminal aifm | vektory |
Výstup do okna na MS Windows | set terminal windows | rastr |
Výstup do okna na X Window | set terminal x11 | rastr |
Výstup na obrazovku v MS-DOSu | set terminal svga | rastr |
Výstup do PostScriptu | set terminal post | vektory |
Formát CorelDraw | set terminal corel | vektory |
Formát AutoCAD DXF | set terminal dxf | vektory |
Formát PBM (Portable Bitmap) | set terminal pbm | rastr |
Výstup ve formátu GIF | set terminal gif | rastr |
Výstup ve formátu PNG | set terminal png | rastr |
Formát HPGL (pro plottery) | set terminal hpgl | vektory |
Formát pro tiskárny s PCL | set terminal pcl5 | vektory |
Výstup pro LaTeX | set terminal latex | vektory |
Výstup pro LaTeX s ovladačem pro emTeX | set terminal emtex | vektory |
Výstup ve formátu MetaFONTu (pro TeXovské fonty) | set terminal mf | vektory |
V případě výstupu do externího souboru je zapotřebí provést přesměrování. To se provádí pomocí příkazu set out „soubor či zařízení“. Při požadavku na vytvoření barevného rastrového obrázku typu GIF s grafem, je možné použít tuto trojici příkazů:
set terminal gif
set out "1.gif"
plot "1.txt"
pro tisk na tiskárnu vybavenou hardwarovým či softwarovým PostScriptem postačí zadat příkazy:
set terminal post
set out "lpr -Ptiskarna"
plot "1.txt"
7. Obsah dalšího pokračování tohoto seriálu
V šestnáctém a současně i posledním pokračování tohoto seriálu si ukážeme, jakým způsobem se v gnuplotu pracuje s grafy dvou nezávislých proměnných.