Hlavní navigace

Matematika v příkazové řádce XV

Pavel Tišnovský

V patnácté - předposlední - části seriálu, který je věnován matematicky zaměřeným aplikacím ovládaným zejména z příkazového řádku a/nebo z celoobrazovkového textového terminálu, si povíme, jakým způsobem jsou v aplikaci gnuplot zpracována a následně vykreslena numerická data uložená v externích souborech. Vykreslení těchto dat představuje jednu z nejdůležitějších a nejpotřebnějších činností, které je možné s gnuplotem provádět.

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.

math15_1

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 gra­fu.

math15_2

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.

math15_3

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 
math15_4

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. diskreti­zovaných signálů je tento způsob nejbližší realitě. Příkaz pro tvorbu tohoto stylu grafu je velmi jednoduchý:

plot "1.txt" with steps 
math15_5

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.

math15_6

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 
math15_7

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 
math15_8

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:

  1. x, y, ydelta – x-ová hodnota, y-ová hodnota a symetrický rozptyl y-ové hodnoty
  2. x, y, ylow, yhigh – x-ová hodnota, y-ová hodnota, nejnižší možná a nejvyšší možná y-ová hodnota
  3. x, y, xdelta – x-ová hodnota, y-ová hodnota a symetrický rozptyl x-ové hodnoty
  4. x, y, xlow, xhigh – x-ová hodnota, y-ová hodnota, nejnižší možná a nejvyšší možná x-ová hodnota
  5. x, y, xdelta, ydelta – x-ová hodnota, y-ová hodnota, symetrický rozptyl x-ové hodnoty a symetrický rozptyl y-ové hodnoty
  6. 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.

math15_9

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.

math15_10

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.

Výstupní grafická zařízení
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.

Našli jste v článku chybu?

16. 5. 2006 18:28

ziggy (neregistrovaný)
Podívám se na tu navržený postup. Díky za radu a celý seriál. Kdyby někdo věděl o možnostech jiných free programů (Maxima?) v tohle směru, byl bych rád. Taky by mě zajímalo, jak naročné by bylo vykreslit ty roviny pomocí jazyka postscript.

16. 5. 2006 8:25

Nechci Vás zklamat, ale mám dojem, že takto přímo ty roviny zobrazit nepůjdou. Napadá mě nejdříve převod na parametrický tvar, tj. funkce typu f1(z)=1-y, f2(z)=x+y a ty potom zobrazit pomocí splot f1(z), f2(z). Možná by mohl ještě pomoci převod na implicitní tvar, tj. na funkce typu g(x,y,z)=0. Potom už stačí použít postup vysvětlený na stránce http://t16web.lanl.gov/Kawano/gnuplot/implicit/solve-e.html
Vitalia.cz: Když přijdete o oko, přijdete na rok o řidičák

Když přijdete o oko, přijdete na rok o řidičák

Měšec.cz: mBank cenzuruje, zrušila mFórum

mBank cenzuruje, zrušila mFórum

Vitalia.cz: Znáte „černý detox“? Ani to nezkoušejte

Znáte „černý detox“? Ani to nezkoušejte

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Vitalia.cz: „Připluly“ z Německa a možná obsahují jed

„Připluly“ z Německa a možná obsahují jed

Lupa.cz: Teletext je „internetem hipsterů“

Teletext je „internetem hipsterů“

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

120na80.cz: Na ucho teplý, nebo studený obklad?

Na ucho teplý, nebo studený obklad?

Měšec.cz: Air Bank zruší TOP3 garanci a zdražuje kurzy

Air Bank zruší TOP3 garanci a zdražuje kurzy

120na80.cz: Co všechno ovlivňuje ženskou plodnost?

Co všechno ovlivňuje ženskou plodnost?

Podnikatel.cz: Udávání kvůli EET začalo

Udávání kvůli EET začalo

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

DigiZone.cz: Rádio Šlágr má licenci pro digi vysílání

Rádio Šlágr má licenci pro digi vysílání

120na80.cz: Jmelí je více léčivé než jedovaté

Jmelí je více léčivé než jedovaté

Vitalia.cz: Taky věříte na pravidlo 5 sekund?

Taky věříte na pravidlo 5 sekund?

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

Vitalia.cz: Spor o mortadelu: podle Lidlu falšovaná nebyla

Spor o mortadelu: podle Lidlu falšovaná nebyla

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu