Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Lekce 03

Octave nabízí spoustu funkcí, které umožňují tvorbu grafů. My se zaměříme na 2D grafy, které budeme tvořit pomocí funkce plot. Tato funkce obsahuje velké množství parametrů a my se zaměčíme na ty nejzákladnější. Pokud si budete chtít prostudovat i další možnosti, podívejte se prosím do dokumentace nebo v Octave spušťte příkaz help plot.

První graf

Začneme zlehka a podívame se co se stane, když si vykreslíme vektor obsahující tři hodnoty. Do proměnné aa uložíme vektor [2,1,4,3,5][2, 1, 4, 3, 5]

a=[2 1 4 3 5]
a =

   2   1   4   3   5

Nyní zavoláme funkci plot a jako argument použijeme vektor aa.

POZOR: V kódu se vyskytuje řádek set(gcf,'Visible','on'). Ten prosím směle ignorujte, je zde pouze pro potřeby generování webové stránky (v Octave jej není potřeba zadávat).

#Tento řádek ingorujte, slouží pro potřebu generování webové stránky
set(gcf,'Visible','on')

plot(a)
<IPython.core.display.Image object>

*Co se vlastně vykreslilo? *

  • Na ose yy jsou postupně vykresleny jednotlivé hodnoty vektoru aa.

  • Protože jsme zadali pouze jeden vstupní vektor, hodnoty na ose xx se určili automaticky jako posloupnost od 1 do 5.

  • Funkce plot navíc jednotlivé body spojila pomocí přímek.

  • Povšimněte si, že Octave automaticky zvolil rozsah os xx a yy tak, aby se celý graf “vlezl do obrázku”.

Takovéto použití funkce plot jistě lze v některých situacích využít, ale automatická volba hodnot na ose xx je velmi limitující. Proto si nyní ukážeme, jak upravit kód aby bylo možno volit i hodnoty na ose xx.

Složitější graf

Řekněme, že chceme vykreslit graf, který bude tvořen následujícími body (v daném pořadí): [13],[3,2][1 3], [3, 2] a [6,4][6, 4]. Abychom takový graf mohli vykreslit, musíme ze souřadnic zjistit hodnoty na osách xx a yy (z každého vektoru vybereme první respektive druhou hodnotu). Pro přehlednost budeme tyto hodnoty rovnou ukládat do proměnných xx a yy.

x=[1 3 6]
y=[3 2 4]
x =

   1   3   6

y =

   3   2   4

Nyní můžeme zavolat funkci plot a vektory xx a yy použijeme jako parametry.

#Tento řádek ingorujte, slouží pro potřebu generování webové stránky
set(gcf,'Visible','on')

plot(x,y)
<IPython.core.display.Image object>

Mějte na paměti, že u parametrů funkce je třeba dodržet dané pořadí. Octave se “nedívá” na pojmenování proměnných, takže pokud bychom prohodily xx a yy, bude si myslet, že jsme to tak chtěli provést. Ostatně, výsledek si můžeme prohlédnout:

#Tento řádek ingorujte, slouží pro potřebu generování webové stránky
set(gcf,'Visible','on')


plot(y,x)
<IPython.core.display.Image object>

Nyní již umíme vykreslit graf, nicméně potřebujeme k tomu znát souřadnice všech bodů, které chceme vykreslit. Pokud bychom ale takto chtěli vykreslit například graf funkce sin(x)sin(x) na intervalu 0,π\langle 0, \pi\rangle, museli bychom vypočítat spoustu bodů této funkce a navíc je pracně zadávat do vektorů xx a yy. Naštěstí můžeme použít jiné funkce Octave a vše si výrazně urychlit.

Postup

  1. Do proměnné xx si uložíme vektor hodnot, který nám vhodně “pokryje” interval, na kterém chceme funkci vykreslit.

x=0:0.1:2*pi
x =

 Columns 1 through 8:

         0    0.1000    0.2000    0.3000    0.4000    0.5000    0.6000    0.7000

 Columns 9 through 16:

    0.8000    0.9000    1.0000    1.1000    1.2000    1.3000    1.4000    1.5000

 Columns 17 through 24:

    1.6000    1.7000    1.8000    1.9000    2.0000    2.1000    2.2000    2.3000

 Columns 25 through 32:

    2.4000    2.5000    2.6000    2.7000    2.8000    2.9000    3.0000    3.1000

 Columns 33 through 40:

    3.2000    3.3000    3.4000    3.5000    3.6000    3.7000    3.8000    3.9000

 Columns 41 through 48:

    4.0000    4.1000    4.2000    4.3000    4.4000    4.5000    4.6000    4.7000

 Columns 49 through 56:

    4.8000    4.9000    5.0000    5.1000    5.2000    5.3000    5.4000    5.5000

 Columns 57 through 63:

    5.6000    5.7000    5.8000    5.9000    6.0000    6.1000    6.2000

Rozbor:

  • první hodnota (0) je počáteční bod intervalu

  • poslední hodnota (2π2\pi) je konečný bod intervalu

  • prostřední hodnota je velmi důležitá, určuje s jak “velkým krokem” se bude pracovat - zvolili jsme hodnotu 0,1 Do proměnné se tedy nejprve uloží hodnota 0 a následně se budou ukládat čísla vždy o 0,1 větší než číslo předchozí (tj. 0,2;0,3;0,2; 0,3; \dots). Toto bude probíhat, dokud nebude překročena poslední hodnota. Jak vidíme, do vektoru xx se celkem uložilo 63 hodnot. Tímto jsme dosáhli pokrytí intervalu 0,2π\langle 0, 2 \pi \rangle.

  1. Tyto body následně použijeme ve funkci plot jako první argument.

  2. Jako druhý argument použijeme samotnou funkci, kterou chceme vykreslit (Pozor: pokud v prvním kroku ukládáme hodnoty do proměnné xx, musíme v tomto kroku použít xx jako proměnnou)

#Tento řádek ingorujte, slouží pro potřebu generování webové stránky
set(gcf,'Visible','on')

plot(x,sin(x))
<IPython.core.display.Image object>

Výsledkem je funkce sin(x)sin(x) na intervalu 0,2π\langle 0, 2 \pi \rangle.

Zvolený postup lze aplikovat na libovolnou funkci (stačí nahradit druhý argument funkce plot požadovanou funkcí). Pokud bychom chtěli vykreslit funkcí cos(x)2+2{\cos(x)\over 2} +2, stačilo by zadat:

#Tento řádek ingorujte, slouží pro potřebu generování webové stránky
set(gcf,'Visible','on')

plot(x,cos(x)/2+2)
<IPython.core.display.Image object>

Pokud bychom chtěli upravit interval, bude třeba nejprve upravit hodnoty v proměnné xx. Řekněme, že chceme předchozí funkci vykreslit na intervalu 2π,4π\langle -2 \pi, 4\pi \rangle:

x=-2*pi:0.1:4*pi;

#Tento řádek ingorujte, slouží pro potřebu generování webové stránky
set(gcf,'Visible','on')

plot(x,cos(x)/2+2)
<IPython.core.display.Image object>

Možná teď uvažujete nad tím, jestli je třeba vždy zvolit “délku kroku” pří vytváření vektoru xx zrovna 0,1. Není tomu tak, volba je zcela na Vás a je třeba zvolit rozumný kompomis. Když bude krok moc velký, může být výsledná funkce moc “hranatá”, naopak s moc malým krokem bude vektor xx obsahovat velké množství hodnot a výpočet grafu pak bude trvat delší dobu (všimněte si v kódu středníku při vytváření vektoru xx - ten potlačí výstup na obrazovku, takže se nám nevypíšou hodnoty vektoru xx, kterých je 189) být výpočet zbytečně náročný.

Co se stane, když zvolíme moc velký krok si ukážeme na funkci sin(x)sin(x):

x=0:1:2*pi

#Tento řádek ingorujte, slouží pro potřebu generování webové stránky
set(gcf,'Visible','on')

plot(x,sin(x))
x =

   0   1   2   3   4   5   6

<IPython.core.display.Image object>

Jak vidíme, při volbě kroku o délce 1 se funkce počítá pouze pro 7 bodů a je hdoně hrbatá. Pokud se Vám něco takového stane, je třeba upravit délku kroku na menší.

Hrajeme si se vzhledem

V této části si ukážeme, jak upravit vzhled grafu tak, aby nám vyhovoval. Pokud nebude řečeno jinak, budeme používat graf funkce sin(x)sin(x). Začneme barvou grafu:

Změna barvy grafu

x=0:0.1:2*pi;

#Tento řádek ingorujte, slouží pro potřebu generování webové stránky
set(gcf,'Visible','on')

plot(x,sin(x),'g')
<IPython.core.display.Image object>

Pokud chceme změnit barvu, je třeba zadat třetí parametr, kde do jednoduchých uvozovek vložíme písmeno, které určí barvu. V našem případě parametr 'g' změni barvu grafu na zelenou. Základní barvy jsou značeny následujícími barvami:

  • k - černá (blacK)

  • r - červená (Red)

  • g - zelená (Green)

  • b - modrá (Blue)

  • y - žlutá (Yellow)

  • m - magenta (Magenta)

  • c - azurová (Cyan)

  • w - bílá (White)

Další, co bychom mohli chtít změnit je typ grafu. Řekněme, že bychom chtěli použít tečkovaný graf místo čárového.

Změna typu grafu

x=0:0.1:2*pi;

#Tento řádek ingorujte, slouží pro potřebu generování webové stránky
set(gcf,'Visible','on')

plot(x,sin(x),':')
<IPython.core.display.Image object>

Obdobně jako u změny barvy, je třeba zadat třetí parametr, kde do jednoduchých uvozovek vložíme příslušný symbol. V našem případě parametr ':' který změní typ grafu na tečkovaný. Základní typy jsou značeny následujícími symboly:

  • -' čárový graf (bude použit, pokud nezvolíme jiný typ)

  • -- čárkovaný graf

  • : tečkovaný graf

  • -. čerchovaný graf

Také se nám nemusí být, že body grafu jsou spojené.

Bodový graf

Opět je třeba zadat třetí parametr, kde do jednoduchých uvozovek vložíme příslušný symbol. V našem případě parametr 'o' který v grafu zobrazí pouze vypočítané body pomocí koleček. Základní typy jsou značeny následujícími symboly:

  • + “vodorovný” kříž

  • o kolečko

  • * hvězdička

  • . tečky

  • x křížek

  • s čtvereček

  • d diamant

  • ^ trojúhelník směřující nahoru

  • v trojúhelník směřující dolů

  • > trojúhelník směřující doprava

  • < trojúhelník směřující doleva

  • p pentagram

  • h hexagram

Navíc všechny výše uvedené parametry se dají kombinovat

Kombinace parametrů

x=0:0.1:2*pi;

#Tento řádek ingorujte, slouží pro potřebu generování webové stránky
set(gcf,'Visible','on')

plot(x,sin(x),'ro:')
<IPython.core.display.Image object>

V grafu byl jako třetí parametr použit 'ro:'. Graf tedy vypadá takto:

  • r - graf má červenou barvu

  • o - body grafu budou vyznačeny kolečkem

  • : - zvolili jsme typ čáry, body tedy budou spojeny pomocí tečkované čáry

Popis grafu

Nyní již umíme graf funkce nejen vykreslit, ale umíme i nastavit jeho barvu, jeho typ apod. Nyní se podíváme, jak graf popsat:

x=0:0.1:2*pi;

#Tento řádek ingorujte, slouží pro potřebu generování webové stránky
set(gcf,'Visible','on')

plot(x,sin(x))

xlabel('osa x')
ylabel('osa y')
title('Nazev grafu')
legend('nazev funkce')
<IPython.core.display.Image object>

V grafu jsme použili celkem čtyři nové příkazy, které nám umožnili funkci popsat:

  • xlabel('osa x') - popis osy xx

  • ylabel('osa y') - popis osy yy

  • title('Nazev grafu') - název grafu

  • legend('nazev funkce') - legenda (pokud se v grafu vyskytuje více funkcí, názvy/popis se odděluje pomocí čárky)

Poslední věc, kterou si ukážeme je vykreslení více funkcí v jednom grafu.

Více funkcí v grafu

Nyní si ukážeme, jak vykreslít více funkcí v jednom grafu. Nejspíš Vás napadne použít jednoduše dvakrát po sobě funkci plot:

x=0:0.1:2*pi;

#Tento řádek ingorujte, slouží pro potřebu generování webové stránky
set(gcf,'Visible','on')

plot(x,sin(x))
plot(x,cos(x))
<IPython.core.display.Image object>

Jak vidíme, toto náš problém nevyřešilo, vykreslila se pouze druhá funkce (ve skutečnosti Octave vykreslí první funkci, následně ji ale smaže a vykreslí druhou funkci).

Musíme tedy Octave říct, že již vykreslené funkce nemá mazat. K tomu slouží příkat hold on:

x=0:0.1:2*pi;

#Tento řádek ingorujte, slouží pro potřebu generování webové stránky
set(gcf,'Visible','on')

plot(x,sin(x))
hold on
plot(x,cos(x))
<IPython.core.display.Image object>

Jak vidíme, nyní již Octave vykreslil obě funkce do jednoho grafu. Navíc pro druhou funkci automaticky zvolil jinou barvu (aniž bychom mu to řekli), aby bylo možné funkce odlišit. Takto je možné do grafu vykreslit tolik funkcí, kolik budeme chtít.

Poznámka: k příkazu hold on exituje i opačný příkaz hold off, který opět “zapne mazání starých funkcí”.

Změna rozsahu os grafu

Poslední příkaz, který si ukážeme je příkad axis, který nám umožní změnit rozsah os grafu:

x=0:0.1:2*pi;

#Tento řádek ingorujte, slouží pro potřebu generování webové stránky
set(gcf,'Visible','on')

plot(x,sin(x))

axis([0,2*pi,0,1])
<IPython.core.display.Image object>

Pomocí příkazu axis jsme změnili rozsah os pomocí čtyřprvkového vektoru tak, že na ose xx se pohybujeme na intervalu 0,2π\langle 0, 2\pi\rangle (první dva parametry funkce axis) a na ose yy se pohybujeme na intervalu 0,1\langle 0, 1\rangle (třetí a čtvrtý parametr funkce axis).