Hlavní navigace

Gnuplot: datové soubory

22. 8. 2001
Doba čtení: 6 minut

Sdílet

Informace hýbou světem. A spoustu informací tvoří nic neříkající čísla, dokud je nějakým vhodným způsobem nezvizualizujeme (vyslovte desetkrát za sebou a běžte se napít :). Dnes se tedy podíváme, jakým způsobem gnuplot pracuje s datovými soubory.

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.

Tabulka č. 180
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.

ict ve školství 24

  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.

Seriál: Gnuplot

Autor článku