Gnuplot: grafy funkcí

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

Sdílet

V dnešním pokračování se podíváme na to, jak se v gnuplotu vytvářejí grafy dané funkčním předpisem. Ukážeme si, jak můžeme ovlivnit vzhled grafu, a třeba také, jak dostat do jednoho obrázku více křivek různých měřítek.

Pro kreslení funkcí se v gnuplotu používá příkaz plot. Jelikož se dnes budeme zabývat pouze kreslením funkcí, nebudeme prozatím využívat některé možnosti, které tento příkaz nabízí (např. pro interpolaci bodů). Pro funkce můžeme použít tuto podobu příkazu plot:

  plot rozsahy f(x) axes typ souřadnic title "popis" \
                    with specifikace stylu

Parametry musí být zadány přesně v tomto pořadí, ale mohou být, kromě funkce f(x) samozřejmě :), vynechány. Potom se za ně dosadí přednastavené hodnoty. Lze tedy použít všechny tyto zápisy:

  plot sin(x)
  plot [-3.14:3.14][-1.1:1.1] cos(x) with linespoints
  plot [][0:100] x**2 axes x1y2 title "parabola" with lines

ale nelze zapsat např.

  plot log(x) with lines axes x1y1

protože jsme přehodili pořadí přepínačů axes a with a gnuplot tedy nahlásí nedefinovanou proměnnou axes. Je také možné kreslit najednou více křivek, např.

  plot [-4:4] sin(x) with lines, cos(x) with impulses

ale musí být odděleny čárkou a mají společný první parametr (rozsahy os).

Nastavování rozsahů

Pokud rozsahy nespecifikujeme, je na ose x nastaveno rozmezí ← 10; 10> a rozsah na ose y je automaticky dopočítán tak, aby se graf vešel do obrázků celý.

Nejjednodušeji můžeme rozsahy zadat jako první parametr příkazu plot. Uvádějí se do hranatých závorek ([min:max]) a značí postupně rozsah pro osu x, y a případně z. Pokud uvedeme prázdné závorky (nebo specifikaci [:]), použije se globální nastavení (nebo automatické dopočítávání, je-li zapnuto).

Toto nastavení však platí pouze pro jeden graf. Chceme-li kreslit více grafů nebo více křivek v jednom grafu, může se nám hodit globální nastavení. To se provádí pomocí příkazu set [xyz]{2}range. Z hranatých závorek zvolíme jedno písmenko, číslo ve složených závorkách je volitelné (gnuplot zná totiž ještě osy x2, y2 a z2 – více u přepínače axes). Např.

  set xrange [-2:2]
  set y2range [1:*]

Toto nastavení se pak použije, nespecifikujeme-li jinak, u příkazu plot. V tomto případě můžeme též využít další parametry reverse a writeback. Reverse mění orientaci osy (dá se však zapsat i jako set xrange [4:1]).

Parametr writeback slouží pro uchování hodnot nastavení os předchozí křivky. Využijeme ho v případě, kdy například vykreslíme první funkci, necháme dopočítat osu y a druhou funkci chceme dokreslit do stejného obrázku a daných souřadnic (gnuplot přepočítává osy pro každou funkci – snaží se, aby byl vidět celý průběh všech křivek):

  set xrange [-3:3]
  set yrange [] writeback
  set autoscale y
  plot sin(x)
  set noautoscale y
  replot x**2

Kdybychom nepoužili u osy y přepínač writeback, vrátil by se při vykreslování funkce x**2 rozsah této osy na implicitních ← 10;10> a sinusovku bychom viděli téměř jako rovnou čáru.

Standardně jsou nastaveny na noreverse a nowriteback. Ještě zmíním, že v předchozím příkladu příkaz set autoscale y zapíná (respektive noautoscale vypíná) dopočítávání osy y a příkaz replot překresluje celou obrazovku a dokresluje novou funkci (chová se tedy jako plot sin(x), x**2).

Přepínač title

U každého grafu je automaticky generována také legenda (vypnout ji můžeme příkazem set nokey). Implicitně je tam dosazen popis funkce (tedy např. sin(x)). Pokud nám to z nějakého důvodu nevyhovuje, můžeme popisek pomocí title zaměnit libovolným řetězcem uzavřeným do uvozovek (případně apostorfů).

Přepínač axes

Přepínač axes slouží k určení, ke kterým z možných os se daná křivka vztahuje. Máme tyto čtyři možnosti:

Tabulka č. 175
x1y1 implicitní, osa dole a vlevo
x1y2 osa dole a vpravo
x2y1 osa nahoře a vlevo
x2y2 osa nahoře a vpravo

Toto samozřejmě nemá smysl v případě, že máme na všech osách stejné měřítko. Ale s využitím výše popsané změny rozsahu jednotlivých os to již může být zajímavé. Můžeme tak totiž v jednom obrázku mít křivky s různým měřítkem.

Musíme mít však ještě prostředek, jak qnuplotu vysvětlit, které osy a jak zobrazovat. Implicitně totiž popisuje pouze osy x1y1, na které se ostatně kreslí skoro všechny grafy.

Slouží k tomu příkaz set [xyz]{2}[md]tics. Jak sami vidíte, je poměrně rozsáhlý, a to obsahuje ještě spoustu vnitřních parametrů. Proto pouze stručně, zbytek je pěkně popsán v nápovědě (help xtics).

Volitelné písmeno m (month) převádí čísla na ose na anglické názvy měsíců (modulo 12) a písmeno d (day) na anglické názvy dnů (modulo 7, počínaje nedělí). Takže je můžeme využít, zobrazujeme-li nějaký dlouhý časový průběh.

Popisy os můžeme umístit buďto na okraj grafu (set xtics border), nebo na nulové osy (set xtics axis). Můžeme chtít, aby se značky (nenašel jsem asi správné slovo, ale jde o takové ty impulsky na grafu, podle kterých poznáme, jaké je měřítko a kde je např. jednička) zobrazovaly i na protější ose (set xtics mirror, implicitně nastaveno pro osy x1 a y1). Tyto značky jsou počítány automaticky (set xtics autofreq).

Pokud chceme změnit jejich hustotu, můžeme využít zápisu set xtics min, krok, max. Vynecháme-li v tomto zápisu min (resp. max), nahradí se výrazem mínus nekonečno (resp. nekonečno).

Nakonec můžeme také přímo říct, u kterých značek chceme, aby v grafu byly. Jejich úplný výčet zapíšeme do kulatých závorek (set xtics (10, 20, 40, 80)). V tomto případě je můžeme také nahradit jiným (i slovním) pojmenováním. Toto pojmenování se pak píše do uvozovek před číslo, které vlastně nahrazujeme (set xtics („pomalu“ 0, "" 50, „rychle“ 100)).

Takže nyní víme, jak nastavit zobrazování popisu os, a můžeme využívat i přepínač axes. Nakonec ukáži ještě jeden příklad, který snad pomůže vyhnout se některých chybám.

  set xrange [0:31.4159] #rozsah osy x
  set yrange [-1:1]
  set y2range [-2:2]     #změněný rozsah pro osu y2
  set xtics 3.14159*2    #chceme mít značku pro každou celou vlnu
  set ytics nomirror     #vypneme rušivé značky z osy y na ose y2
  set y2tics -2,0.5,2    #značky na ose y2 s krokem 0.5

  plot sin(x), sin(x) axes x1y2  #první sinus pro x1y1

  pause -1 "Stiskni enter..."    #čeká na enter, vhodné v xsech

Takto jednoduše jsme do jednoho obrázku dostali dva grafy v různém měřítku. Osa x je oběma společná, měřítko určují osy y a y2, každá se svými popisky.

Přepínač with

Tento přepínač slouží k odlišení jednotlivých čar a bodů v grafu a k výběru jednoho z mnoha možných stylů vykreslování (jejich seznam a popis můžeme získat příkazem help style). Základní styl pro funkce je lines (čáry; můžeme změnit příkazem set function style), pro datové soubory points (body; změníme pomocí set data style).

Styl pouze určuje způsob vykreslování, tzn. zda bude graf vykreslen spojitými čárami, jednotlivými body, nebo třeba pomocí svislých čar. Barvu a tloušťku (resp. velikost) čáry (resp. bodu) pak určují další parametry.

Typ čáry (nejčastěji barvu) a bodu (symbol) určíme parametrem linetype (resp. pointtype), za nímž následuje celočíselné číslo, reprezentující daný typ. Jejich seznam pro zvolený terminál můžeme získat příkazem test.

Šířku čáry (velikost bodu) určíme parametrem linewidth (resp. poitsize). Za nimi následuje obecně reálné číslo, určující kolikrát je daná čára (bod) širší (větší) než základní velikost.

Pomocí příkazu set linestyle si také můžeme předdefinovat požadované styly a pak používat pouze přepínač linestyle. Použití ukáže následující příklad:

  set linestyle 1 linetype 4 linewidth 2 pointtype 3 pointsize 2
  plot sin(x) with linespoints linestyle 1

funguje úplně stejně jako

  plot sin(x) with linespoints \
       linetype 4 linewidth 2 pointtype 3 pointsize 2

Závěr

Nyní již máme dostatek znalostí a můžeme vytvářet opravdu pěkné grafy. Seznam všech dostupných funkcí a jejich popis získáme příkazem help functions. Můžeme také jednoduše definovat vlastní funkce, např. zápisem

  f(x) = sin(x) * cos(x)

a pak použít pouze plot f(x). Seznam všech operátorů nám dá příkaz help operators.

Úplně na závěr dnešního pokračování si ukážeme, jak tedy může vypadat zápis při vykreslování funkce:

ict ve školství 24

  plot [-3.14:3.14][-1:1] sin(x) \
       axes x1y1 \
       title "sinus" \
       with linespoints \
       linetype 4 linewidth 2 pointtype 5 pointsize 2

Pro „šetřílky“ uveďme, že je možný i zápis

  p [-3.14:3.14][-1:1] sin(x) ax x1y1 t "sinus" \
                              w lp lt 3 lw 2 pt 5 ps 2

ovšem čitelnost je ta tam.

Seriál: Gnuplot

Autor článku