Portál AbcLinuxu, 16. dubna 2024 12:21

Octave - 11 (kreslíme grafy)

5. 4. 2006 | Jiří Poláček
Články - Octave - 11 (kreslíme grafy)  

Jak Octave řeší grafický výstup, princip vykreslování čáry a kterak nastavit barvy, styly a legendu.

Jak Octave řeší grafický výstup

Octave ve snaze podobat se co nejvíce Matlabu obsahuje také podporu pro grafický výstup (ve smyslu kreslení matematických grafů). Samo o sobě však Octave grafy kreslit neumí - pro tento účel využívá program gnuplot (který je tudíž třeba mít v systému nainstalován). Z jistého úhlu pohledu by se dalo říci, že Octave funguje jako překladač kreslících funkcí z Matlabu do gnuplotu - jedním dechem je však nutno dodat, že se jedná o překladač velmi omezený, který zvládá jenom pár základních příkazů a nastavení. Pro plné využití všech možností gnuplotu máme v Octave k dispozici „nízkoúrovňové funkce“, díky kterým můžeme psát přímo příkazy gnuplotu nad daty z Octave. Následující texty se však budou zabývat především příkazy kompatibilními s Matlabem.

Jak se kreslí čára

Základní princip kreslení dvourozměrných grafů spočívá v zadání souřadnic bodů v kartézské soustavě - Octave vždy dva sousední body spojí úsečkou. Souřadnice bodů se zadávají jako dva vektory, jeden pro x-ové souřadnice a druhý pro y-ové; tyto dva (oba řádkové nebo oba sloupcové, ale hlavně stejně dlouhé) vektory pak figurují jako parametry funkce plot, která zajistí již samotné vykreslení grafu.

Příklad - vytvořme ze čtyř bodů A[0,4], B[5,-2], C[1,-3] a D[3,8] lomenou čáru tak, že bod A bude spojen s bodem B, bod B spojen s bodem C a konečně také bod C spojen s bodem D:

>> x=[0 5 1 3]; y=[4 -2 -3 8];
>> plot(x,y)

Mělo by se nám otevřít grafické okno gnuplotu vypadající podobně jako na následujícím obrázku:

Grafický terminál gnuplotu s vykreslenou
lomenou čarou

Vektor x postupně obsahuje x-ové souřadnice zadaných bodů, stejně tak vektor y obsahuje ve stejném pořadí y-ové souřadnice těch stejných bodů. Při vykreslování jsou pak sousední body spojeny úsečkou (tj. vykreslí se mezi nimi rovná čára). Pokud bychom chtěli zajistit, aby byl úsečkou spojen každý bod s každým, musíme to odpovídajícím způsobem zajistit v souřadnicových vektorech:

>> A=[0 4]; B=[5 -2]; C=[1 -3]; D=[3 8]; body=[A;B;C;D;A;C;B;D];
>> plot(body(:,1),body(:,2))

Čtyři body, každý spojen s každým

V grafu si také můžeme všimnout, že se automaticky nastaví měřítko grafu, vypíší hodnoty na osách a legenda grafu.

Hned na prvních příkladech tedy vidíme, že výsledné grafy nemusí být těmi správnými grafy z hlediska matematické analýzy, i když právě ty nejspíš budeme chtít ve výsledku vidět. Efektu hladké křivky dosáhneme prostě tím, že spočítáme dostatečný počet souřadnic vykreslovaných bodů. Porovnejte sinusoidu vykreslenou z 11 a 201 bodů:

>> x10=0:pi/5:2*pi;
>> plot(x10,sin(x10))
>> % versus
>> x200=0:pi/100:2*pi;
>> plot(x200,sin(x200))

Sinusoida z 11 bodů

Sinusoida z 201 bodů

Uvědomme si u funkce sinus, že se počítá pro každý prvek vektoru x-ových souřadnic, čímž získáváme stejně dlouhý vektor y-ových souřadnic. Abychom si ušetřili čas s vymýšlením formule pro vektor lineárně rozložených x-ových souřadnic, můžeme používat funkci linspace, které zadáme dolní mez, horní mez a počet prvků výsledného vektoru:

>> linspace(0,10,4)
ans =
   0.00000   3.33333   6.66667  10.00000

Více grafů, více barev

Ve výchozím nastavení každé volání příkazu plot inicializuje výstupní zařízení, tj. smaže případný obsah z předchozích kreslících výstupů. Pokud chceme do grafu „přikreslovat“, nabízí se nám v podstatě dvě možnosti, které můžeme libovolně kombinovat. V prvé řadě můžeme podržet aktuální obsah výstupního zařízení s pomocí funkce hold. Volána s parametrem on tuto vlastnost zapíná, off značí výchozí stav mazání a konečně volání této funkce bez parametru přepíná z jednoho stavu do druhého. V jakém stavu se teď nacházíme, zjistíme funkcí ishold:

>> plot(x,sin(x))
>> ishold
ans = 0
>> hold on
>> plot(x,cos(x))
>> hold off

Sinus a kosinus v jednom grafu

Druhou možností je zadání všech grafů do jediného příkazu plot, který může mít variabilní počet parametrů:

>> plot(x,sin(x),x,cos(x))

Přesněji řečeno, funkce plot může zpracovat libovolný počet dvojic x-ových a y-ových souřadnic. Navíc za každou touto dvojicí může následovat třetí volitelný řetězcový parametr, který upřesňuje barvu a styl čáry, respektive popisek k ní. Začněme ilustračním příkladem:

>> plot(0:5,5:-1:0,'^',0:6,6:-1:0,'Lm ',0:8,8:-1:0,'g*;popisek;' , \
0:.1:9,9:-.1:0,'.3',1:10,9:-1:0,'-@78',2 :10,9:-1:1,'c;usecka;')

Spousta čar s různými styly a barvami

Za pomoci čísel, významových znaků a textů mezi středníky tak můžeme u každé vykreslované čáry určit:

Obecně nezáleží na pořadí, v jakém se znaky zapíší, přesto to chce trochu experimentovat a nebýt překvapen, že kupříkladu číselná reprezentace barev může na každém výstupním zařízení znamenat něco jiného.

Příští povídání o Octave bude s grafy pokračovat, konkrétně se zaměří na měřítko os, popisky ke grafům a speciální dvourozměrné grafy.

Seriál Octave (dílů: 16)

První díl: Octave - 1 (je to kalkulačka), poslední díl: Octave - 16 (a co dál?).
Předchozí díl: Octave - 10 (zbylé řídicí struktury)
Následující díl: Octave - 12 (měřítko os a speciální grafy)

Související články

Octave - 1 (je to kalkulačka)
Octave - 2 (počítání s maticemi)
Octave - 3 (přístup k jednotlivým položkám matice)
Octave - 4 (je to pravda?)
Octave - 5 (práce s řetězci)
Octave - 6 (práce se soubory)
Octave - 7 (vlastní skripty a funkce)
Octave - 8 (větvení programu)
Octave - 9 (cykly)
Octave - 10 (zbylé řídicí struktury)
Octave - 12 (měřítko os a speciální grafy)
Octave - 13 (dokončení grafiky)
Octave - 14 (finance a statistika)
Octave - 15 (špetka matematiky)
Octave - 16 (a co dál?)
Vektorový elegán Ipe
Recenze: Kniha kódů a šifer
Awk & sed: Příručka pro dávkové zpracování textu
SETI@home
Jak se píše procesor
GnuCash - domácí účetnictví na úrovni
Použití gnuplot pro tvorbu grafů v PHP
Hra s písmenky - wxMaxima

Odkazy a zdroje

Octave

Další články z této rubriky

LLVM a Clang – více než dobrá náhrada za GCC
Ze 4 s na 0,9 s – programovací jazyk Vala v praxi
Reverzujeme ovladače pro USB HID zařízení
Linux: systémové volání splice()
Programování v jazyce Vala - základní prvky jazyka

Diskuse k tomuto článku

6.4.2006 07:44 GeBu | skóre: 27 | blog: zápisky
Rozbalit Rozbalit vše Re: Octave - 11 (kreslíme grafy)
Odpovědět | Sbalit | Link | Blokovat | Admin
Znamená něco příkaz: "% versus", který je v textu v příkladu sinusovek s různou kvalitou?
Jiří Poláček avatar 6.4.2006 08:25 Jiří Poláček | skóre: 47 | blog: naopak | Sivice
Rozbalit Rozbalit vše Re: Octave - 11 (kreslíme grafy)
znak % uvozuje komentář
Sudoku omrzelo? Zkuste bobblemaze! | Statistiky jsou jak bikiny. Napoví hodně, všechno ale neukážou.
6.4.2006 07:46 GeBu | skóre: 27 | blog: zápisky
Rozbalit Rozbalit vše Re: Octave - 11 (kreslíme grafy)
Odpovědět | Sbalit | Link | Blokovat | Admin
Ve Windows verzi mi nefunguje "hold on" :(
parse error:
>>> hold on
^
>> hold on
parse error:
>>> hold on
Jiří Poláček avatar 6.4.2006 08:56 Jiří Poláček | skóre: 47 | blog: naopak | Sivice
Rozbalit Rozbalit vše Re: Octave - 11 (kreslíme grafy)
Vyzkoušel jsem teď tento příkaz ve windowsových verzích 2.1.36, 2.1.50 a 2.1.73 stažených z octave.sf.net a všude mi příkaz "hold on" bez problémů funguje. Vzhledem k tomu, že za příkazem hold se očekává textový parametr, zkuste hold 'on'.
Sudoku omrzelo? Zkuste bobblemaze! | Statistiky jsou jak bikiny. Napoví hodně, všechno ale neukážou.
6.4.2006 09:23 GeBu | skóre: 27 | blog: zápisky
Rozbalit Rozbalit vše Re: Octave - 11 (kreslíme grafy)
Ty apostrofy zabraly. Děkuji za obě odpovědi.
12.4.2006 23:56 asym | skóre: 5 | blog: Psychopat
Rozbalit Rozbalit vše Re: Octave - 11 (kreslíme grafy)
Odpovědět | Sbalit | Link | Blokovat | Admin
V gnuplotu mi jde v pohode mysi rotovat 3D graf. Kdyz je ale volan z octave, tak to nejde. Jak je to mozne?
Kdo nemá rád linux, ten si ho nezaslouží.
Jiří Poláček avatar 14.4.2006 08:40 Jiří Poláček | skóre: 47 | blog: naopak | Sivice
Rozbalit Rozbalit vše Re: Octave - 11 (kreslíme grafy)
V případě vzdáleného volání gnuplotu z Octave není inicializována myš. Příkaz gset mouse před vyreslením grafu tuto nepříjemnost napraví.
Sudoku omrzelo? Zkuste bobblemaze! | Statistiky jsou jak bikiny. Napoví hodně, všechno ale neukážou.
22.4.2006 11:32 asym | skóre: 5 | blog: Psychopat
Rozbalit Rozbalit vše Re: Octave - 11 (kreslíme grafy)
nepomaha ani
__gnuplot_set__ mouse
Kdo nemá rád linux, ten si ho nezaslouží.

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.