Portál AbcLinuxu, 29. května 2024 06:58

Octave - 13 (dokončení grafiky)

26. 4. 2006 | Jiří Poláček
Články - Octave - 13 (dokončení grafiky)  

Třírozměrná grafika, sombrera, plata vajíček a tuning grafů.

Třírozměrná grafika

Současné možnosti třírozměrného grafického výstupu v Octave se omezují na jednoduché drátěné modely, které mohou reprezentovat plochu funkce dvou proměnných - pro představu si můžeme vykreslit sombrero známé z matematické analýzy:

>> sombrero(15)
Ukázka třírozměrného grafu - sombrero

Pro vykreslování se používá příhodně pojmenovaná funkce mesh. Jejími parametry jsou vektory x-ových a y-ových souřadnic a matice z-ových souřadnic pro všechny průsečíky x-ových a y-ových souřadnic. Pokusme se tuto komplikovanou definici vysvětlit na příkladě - nejdříve si připravme x-ové a y-ové souřadnice:

>> x=1:3;
>> y=1:2;
>> [xx, yy] = meshgrid(x, y)
xx =
  1  2  3
  1  2  3
yy =
  1  1  1
  2  2  2

Výstupem funkce meshgrid jsou dvě matice, které dohromady dávají všechny možné průsečíky x-ových a y-ových souřadnic v půdorysu třírozměrného grafu - jeden průsečík je dán prvky ze stejných pozic výsledných matic. Třetí parametr funkce mesh - matice z-ových souřadnic - musí být stejně velká jako tyto výsledné matice, obecně tedy platí, že musí mít tolik řádků, kolik je y-ových souřadnic, a tolik sloupců, kolik prvků obsahuje vektor x-ových souřadnic:

>> z=[4 2 7; 2 5 9];
>> mesh(x,y,z)
Jednoduchý síťový graf

Abychom byli přesní - prvními dvěma parametry funkce mesh mohou být jak souřadnice (průsečíky si funkce dopočítá sama pomocí meshgrid), tak přímo matice průsečíků, které mohou být libovolné, nikoliv jen v přísně ortogonální síti:

>> a=[1 5 6; 1 3 7]; b=[2 3 1; 6 3 5];
>> mesh(a,b,z)
Graf s neortogonální soustavou průsečíků

Pokud nyní vyvstává dotaz, k čemu nám jako uživateli je funkce meshgrid, když ji mesh používá interně, odpoví nám následující příklad:

x=y=linspace(-2*pi,2*pi,50);
[xx,yy]=meshgrid(x,y);
mesh(x,y,sin(xx)+cos(yy))
Plato na vajíčka

V případě tohoto plata na vajíčka je matice z dána funkčním předpisem, kde jako proměnné figurují průsečíky.

Více grafů v jednom okně

Octave podporuje (za předpokladu podpory i ze strany gnuplotu) vykreslování více grafů v jednom okně - nejedná se o nic jiného, než o umístění grafů do matice stanovené velikosti. Funkce multiplot režim vykreslování více grafů do jednoho okna zapíná, jejími parametry jsou počty grafů, které mají být pod sebou a vedle sebe. Funkce mplot pak vykresluje grafy stejným způsobem jako plot s tím rozdílem, že automaticky mění pozici v okně, kam se má graf vykreslit:

x=linspace(-pi, pi, 200);
multiplot(2,2);
mplot(x, sin(x), 'b;sinus x;');
mplot(x, atan(x), '7;arkus tangens x;');
mplot(x, log(x), '9;log x;');
mplot(x, cos(x), 'g;kosinus x;');
Více grafů v jednom okně

Přesnou pozici, kam se má v okně vykreslit další graf, lze zadat funkcí subwindow, parametry jsou řádkový a sloupcový index počítaný z levého horního rohu - do okna tak můžeme vykreslit i grafy, které nelze vykreslit příkazem plot (například histogram či třírozměrný graf). Funkce subplot je kombinací funkcí multiplot a subwindow - má tři parametry, z nichž první dva udávají počet grafů v okně a třetí pak pozici - zde se počítá zleva doprava a pak shora dolů.

Pro doplnění zmiňme funkci figure - pokud grafy vykreslujeme v terminálu x11 (což je výchozí nastavení, viz dále), můžeme pracovat s více okny, jejichž číslo se udává jako parametr této funkce, tj. například první volání figure(10) otevře nové okno s číslem 10 a učiní jej aktivním; pokud po té vytvoříme (a tudíž aktivujeme) jiná okna, tak další volání figure(10) opět zaktivní okno s číslem 10.

Tuning grafů s gnuplotem

Jak již bylo řečeno dříve, grafický výstup v Octave obstarává program gnuplot, což v závislosti na různých verzích programů a kompilačních parametrech s sebou nese různá úskalí. Pro bližší seznámení s gnuplotem můžeme na tomto místě odkázat na obsáhlou nápovědu či seriál článků v češtině, zde zmíníme jen pár užitečných rad.

Řada příkazů gnuplotu je v Octave přímo přístupných se stejnou syntaxí a jménem pozměněným tím způsobem, že na začátek je přidáno písmeno „g“, například gplot či gsplot pro kreslení dvou a třírozměrných grafů. Tyto příkazy jsou klasifikovány jako nízkoúrovňové, nicméně pro pořádné využití grafického výstupu v Octave se bez nich neobejdeme.

Prakticky všechny vlastnosti grafického výstupu lze nastavit s pomocí příkazu gset následovaného popisem, co se vlastně má nastavit - například gset mouse zajistí, že výchozí výstupní terminál x11 (tj. ono jednoduché grafické okno pro vykreslovaní grafů) bude interaktivní, s grafem pak lze dělat předepsané úkony pomocí klávesových zkratek (kupříkladu zobrazení vodících čar; klávesa „h“ vyvolá nápovědu), třírozměrné grafy lze otáčet s pomocí myši atd.

Výstupních terminálů je podporována celá řada, může jím být (na základě dostupnosti ovladačů v systému) i tiskárna či plotter, obrázek (různé vektorové i bitmapové formáty), postskript, PDF, LaTeX atd. Ke změně terminálu se používá dvojice příkazů gset terminal a gset output - obrázky doplňující tento text byly generovány do formátu PNG následující dvojicí příkazů:

gset terminal png size 360,270;
gset output 'grafXYZ.png';

Pozor - v současné době je možné se setkat s instalacemi gnuplotu, které jsou linkovány buď s knihovnou libpng (starý způsob, méně funkcí) nebo s knihovnou gd (nový způsob, více možností nastavení). Druhý způsob umožňuje zejména pracovat s libovolným fontem české znaky nevyjímaje:

gset terminal png font "/usr/X11/lib/X11/fonts/luxirr.ttf" 16;
Graf s vlastním fontem

V případech, kdy chceme mít v grafu více výstupů z kreslících příkazů, může generování do nějakého souboru zlobit - osvědčuje se nachystat si výslednou podobu grafu v terminálu x11 a po té graf sekvencí příkazů gset output, gset terminal a replot zkopírovat do požadovaného souboru.

V grafu z příkladu si také povšimněte desetinné čárky - ačkoliv jsme v Octave nuceni používat desetinnou tečku, naše grafy lze přizpůsobit národním tradicím jednoduchým nastavením:

>> gset decimalsign ',';

Pro třírozměrné grafy je nepostradatelný příkaz gset view, který nastavuje úhel pohledu na vykreslovaný graf. Jeho čtyři parametry nastavují otočení okolo osy x (0-180°), otočení okolo osy z (0-360°), měřítko celého grafu a měřítko pouze osy z. Výchozími hodnotami pro měřítko jsou čísla 1, které lze chápat jako 100% velikost. Pár pohledů:

>> gset view
>> gshow view
        view is 60 rot_x, 30 rot_z, 1 scale, 1 scale_z
>> gset view 30, 340, 1.2, 1.3
>> gset view 20, 0, 1.1, 0.8
Výchozí úhel pohledu Jiný úhel pohledu Ještě jiný úhel pohledu

Příkaz gset view bez parametrů nastavuje výchozí úhel pohledu, gshow prozradí, jak je aktuálně vybraný parametr nastaven. Speciálním pohledem je mapa - gset view map - která zapříčiní projekci grafu do půdorysu, tj. pohled shora - viz příklad u třírozměrné grafiky.

Poznámka na konec - poslední verze Octave označují nízkoúrovňové příkazy gnuplotu jako zastaralé a varují před jejich používáním. Varování se lze vyhnout používáním interních názvů těchto příkazů ve formě __gnuplot_plot__ či __gnuplot_set__ (podtržítka jsou součástí příkazu).

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 - 12 (měřítko os a speciální grafy)
Následující díl: Octave - 14 (finance a statistika)

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 - 11 (kreslíme grafy)
Octave - 12 (měřítko os a speciální grafy)
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

18.5.2006 20:52 asym | skóre: 5 | blog: Psychopat
Rozbalit Rozbalit vše Re: Octave - 13 (dokončení grafiky)
Odpovědět | Sbalit | Link | Blokovat | Admin
me to gset mouse proste nepomaha, porad nemohu tocit 3d grafem
Kdo nemá rád linux, ten si ho nezaslouží.
1.6.2006 18:56 miro | skóre: 19 | blog: miro
Rozbalit Rozbalit vše Problem s nastavenim vystupu
Odpovědět | Sbalit | Link | Blokovat | Admin
Zdravim,

skusam graficky vystup do png, ale po zadani
gset terminal png
dostanem chybovu hlasku
octave:1> gset terminal png parse error:

  syntax error

>>> gset terminal png
                 ^
Gnuplot mam nainstalovany, prikaz
set terminal png
v nom funguje. Pouzivam Octave 2.9.5, Gnuplot 4.0

Nestretli ste sa nahodou niekto s podobnym problemom? Dakujem za pomoc.
21.6.2006 10:26 miro | skóre: 19 | blog: miro
Rozbalit Rozbalit vše Re: Problem s nastavenim vystupu
__gnuplot_set__

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