V minulém díle jsme si ukázali, jakým způsobem se vykreslují grafy funkcí. Pro práci s datovými soubory využíváme stejný příkaz plot, pouze místo funkčního předpisu dáme název datového souboru a jeho specifikaci. Ostatní parametry zůstávají a mají stejnou funkci.
plot rozsahy "datový soubor" specifikace dat axes typ souřadnic title "popis" with specifikace stylu
Data v souboru nemusíme předem nějak zvlášť zpracovávat, gnuplot si s nimi poradí sám. Slouží k tomu tyto další přepínače (píší se na místo specifikace dat).
"data" index seznam every seznam thru výraz using seznam smooth metoda
Než se pustíme do popisu jednotlivých specifikátorů, ujasněme si některé pojmy, které budu v následujícím textu používat.
Řádku v datovém souboru budu nazývat jeden záznam. Každý záznam by měl definovat jeden bod. Ten je dán nejméně dvojicí x, y, přičemž pouze hodnota y je povinná, x doplní gnuplot.
V souboru jsou povoleny i prázdné záznamy. Jeden prázdný záznam dělí soubor na datové bloky a označuje nespojitost v grafu (body oddělené jedním prázdným záznamem nebudou spojené čárou ani při použití plot with lines).
Dva prázdné záznamy dělí soubor na podsoubory. Takto oddělená data jsou zpracovávána, jako by byla v samostatných souborech, ale nemění se typ čáry, což by se při použití dvou souboru implicitně stalo.
Záznam začínající křížkem (#) je ignorován jako komentář. Není však chápán jako prázdný záznam.
Přepínač index
Umožňuje nám vykreslovat pouze určité podsoubory z daného souboru. Používá se zápisu
index M:N:K
Pokud zapíšeme pouze index M, vykreslí se pouze M-tý podsoubor daného souboru. Přidáme-li index M:N, vykreslí se podsoubory M až N. Parametr K pak udává krok, zastaví se ale na N-tém podsouboru. Takže například
plot "data.txt" index 0:4:2
vykreslí pouze první, třetí a pátý podsoubor (čísluje se od nuly).
Přepínač every
Příkaz every je velice podobný příkazu index, ale pracuje „na nižší úrovni“. Jinak řečeno, umožňuje nám z datového souboru vybírat jednotlivé datové bloky a body. Má tuto syntaxi:
every inkrement_bod:blok:první_bod:blok:poslední_bod:blok
,
Pracuje tak, že vybere všechny body a bloky od prvního k poslednímu a v každém kroku přičte inkrement. Jednotlivé údaje mohou být vynechány (píší se pouze předchozí dvojtečky). Potom se za inkrement dosadí jednička, první je číslován od nuly a za poslední se dosadí poslední bod v každém bloku a poslední blok v souboru.
Například pokud chceme vykreslit každý druhý bod celého datového souboru, zapíšeme
plot "data" every 2
To samé, ale pouze z druhého bloku daného souboru (odděleny jednou mezerou)
plot "data" every 2:::1::1
což se automaticky doplní na
plot "data" every 2:1:0:1:4:1
pokud je v druhém datovém bloku právě pět bodů k vykreslení.
Přepínač thru
Přepínač thru je k dispozici pouze kvůli zpětné kompatibilitě se staršími verzemi gnuplotu. Slouží k dosazení bodů z datového souboru do zvolené funkce.
plot "data" thru f(x)
Dnes se však spíše využívá zápisu pomocí using (viz dále)
plot "data" using 1:(f($2))
který má úplně stejnou funkci jako předchozí zápis, ale přesněji specifikuje využití hodnot v souboru.
Přepínač using
Toto je parametr, který umožňuje provádět s datovými soubory opravdová kouzla. Má tuto základní syntaxi:
plot "data" using výraz:výraz:výraz... 'formát'
Nejprve se podívejme, jak vypadá základní (nejjednodušší) datový soubor. Jsou v něm čísla, oddělená nejčastěji mezerami (případně tabelátory), tedy „bílými“ znaky, a soubor je tak rozdělen do sloupců. Toto je také formát, který gnuplot implicitně předpokládá (můžeme upravit použitím parametru ‚formát‘, viz dále).
Jako výraz za přepínačem using můžeme použít jednu z následujících možností:
- Obyčejné číslo. Udává sloupec, který má být použit pro jednotlivé osy (x, y, z). Automaticky se dosazují za x hodnoty z prvního sloupce a za y hodnoty druhého sloupce. Pokud datový soubor obsahuje pouze jeden sloupec, jsou hodnoty x počítány po jedničce od nuly a za y je dosazen tento jediný sloupec.
- Výraz uzavřený do kulatých závorek. Pro jednotlivé sloupce v něm používáme označení $1, $2 atd. A můžeme zde využít všechny možné matematické operace, lze tedy jednotlivé sloupce různě sčítat a podobně.
- Prázdný vstup. Za ten je dosazeno číslo sloupce odpovídající pořadí daného vstupu. Takže zápis using ::5 je shodný s using 1:2:5.
Pro číslo sloupce můžeme dokonce využít i automatické číslování. Pokud zvolíme nulu jako číslo sloupce, generují se čísla od nuly a inkrementují se na každém bodu (řádku) datového souboru. Čítač se nuluje na dvou prázdných řádcích. Číslo sloupce –1 vrací pořadí datového bloku, tj. inkrementuje se na prázdném řádku a nuluje na dvou prázdných řádcích. A konečně číslo sloupce –2 vrací pořadí datového podsouboru. Inkrementuje se pouze na dvou prázdných řádcích.
Je-li za přepínačem using pouze jedno číslo, je použito pro hodnotu y , a pro x je pak použito automatického číslování. Tedy výraz using 3 je stejný jako using 0:3.
Jestliže má datový soubor složitější strukturu, musíme použít i parametr formát a říct tak gnuplotu, jakým způsobem jsou čísla v souboru uložena. Je-li formát použit, je soubor čten standardní funkcí scanf jazyka C. Jediný povolený formát čísla je však %lf. Gnuplot sám přeskočí pouze bílé znaky, takže všechno ostatní musí být explicitně určeno. Nejvíc asi ukážou následující příklady:
Chceme přečíst čísla oddělená v souboru čárkami, přičemž pro hodnotu y je brán součet čísel ve druhém a třetím sloupci:
plot "data" using 1:($2+$3) '%lf,%lf,%lf'
Následující příklad jsem opsal z oficiální dokumentace a ukazuje použití složitého formátu souboru.
plot "data" using "%*lf%lf%*20[^\n]%lf"
Jednotlivé části mají tento význam:
%*lf přeskoč jedno číslo %lf načti jedno číslo, hodnota x %*20[^\n] přeskoč 20 znaků, které nejsou koncem řádky %lf načti jedno číslo, hodnota y
Použití přepínače using někdy není úplně triviální. Ale v případě nouze udělejte pár pokusů. Pokud uděláte chybu v zápisu, gnuplot vás na to upozorní a ukáže vám i přesně, kde k chybě došlo. A časem se vám určitě podaří přijít na správný tvar tak, aby kreslil přesně to, co očekáváte.
Přepínač smooth
Přepínač smooth slouží pro interpolaci (tedy proložení) bodu křivkou. Je k dispozici celkem pět různých metod (viz tabulka). Dokonalejší a obecnější metodu proložení nabízí příkaz fit.
acsplines | x | přirozená kubická spline funkce s váhou |
bezier | bezierova křivka stupně n (počet bodů) | |
csplines | x | přirozená kubická spline funkce |
sbezier | x | bezierova křivka stupně n |
unique | x | polynom prvního stupně |
Pro každou metodu potřebujeme určitý počet bodů, abychom ji mohli použít. Jsou to jeden pro unique , čtyři pro acsplines a tři pro všechny ostatní. Pokud nebude mít metoda dostatek bodů ke zpracování, skončí s chybou (pozor na to, že dostatečný počet bodů musí být v každém datovém bloku). Křížek v tabulce označuje ty metody, které nejprve převedou data na monotonní, tj. body se stejnou hodnotou x přepočtou na jejich aritmetický průměr.
plot "data" smooth csplines
Nejjednodušší proložení je samozřejmě kreslení pomocí čar (plot with lines). Ale tak pouze spojíme jednotlivé body a přechody nejsou hladké. Kdežto při použití jedné ze zmíněných metod vlastně kreslíme funkci, jejíž parametry jsou vypočteny tak, aby odchylky od bodů v datovém souboru byly v jistém smyslu minimální.
Závěr
Datové soubory mají i další možnosti, o kterých jsem se zde jistě nezmínil. Jednou z těchto věcí je například zpracovávání časových údajů. Pokud narazíte na problém, vřele doporučuji ukázkové soubory, které jsou s gnuplotem standardně dodávány. V nich je názorně ukázáno, jak tyto věci řešit. Stačí se jen podívat a vyzkoušet.