Obyčajný plot() nestačí, treba viac

V tomto článku sa budem sústrediť na viac vecí naraz ako len na vykreslenie pekného a profesionálneho grafu. Cieľom je nielen ukázať, že použiť samotný príkaz plot() nestačí, ale aj poukázať na úpravu grafu v dokumente respektíve v prezentácii.

Ako prvé si uveďme častý prípad usporiadania štyroch grafov v prezentáciach. Všetky grafy sú v tejto ukážke vykreslené v použitím princípov predstavených v mojom minulom blogu. Uvažujme scenár kedy porovnávame niekoľko regulačných pochodov spolu s profilmu akčných zásahov. Typický scenár na obhajobe bakalárskej resp. diplomovej práce.

Študenti intuitívne spravia nasledovnú vec (ukážka plného slideu - po slovensky snímku):
ukazka snimku 1

Tento slajd obsahuje niekoľko principiálnych chýb, okrem zle naformátovaných grafov. Štandardná MS PowerPoint šablóna - obsahuje veľme veľa mŕtveho miesta najme pookrajoch a nad názvom slajdu. Tým pádom si ukrojíte z priestoru na prezentáciu výsledkov.

Ako druhé si treba uvedomiť, čo ideme obecenstvu komunikovať. Usporiadanie grafov - chceme im ukázať výsledný regulačný pochod a zároveň jemu prislúchajúce priebehy akčných zásahov. Tým pádom je doležité prisluchajúce grafy usporiadať pod seba t.j. hore graf s výstupom a dole graf s akčným zásahom. Tým pádom bude obecenstvo vidieť korešpondujúce časové priebehy, keď sú tieto grafy vedľa seba, je komplikovanejšie si uvedomiť, ktorá zmena na vstupe prislúcha ku zmene na výstupe.

Aby som ešte lepšie demonštroval pointu tohto blogu, preusporiadam obrázky a ukážem koncepčne správny slajd:
ukazka snimku 2

A teraz sa môžeme venovať formátovaniu grafov a povedať si čo je tu nedobre urobené. Ako prvé si treba uvedomiť, že keď porovnávame dva priebehy, tak nastavenie grafu musi byť rovnaké, aby sme si uvedomili aj ten najmešní rozdiel medzi priebehmi. To znamená, že y-os ľavých grafov musí mať rovnaký rozsah ako y-ová os pravých grafov. Následne si môžeme všimnúť, že mnohé krivky sa nám prelínajú s orámovaním grafu. To je taktiež nesprávne. Obsah grafu by mal "visieť" v priestore, čiže rozsah y-ovej osi zvačšíme. Tieto modifikácie by sme vedeli docieľiť príkazom axis([0, 10, -0.5, 2]). To však nie je celkom vhodné riešenie, lebo tento príkaz neponúka plnú kontrolu nad formátovaním grafu. Predstavíme si radšej príkaz set(), ktorým sme schopní nastaviť akýkoľvek atribút grafu, najme jeho rozsahy, jeho mierku, dokonca sme schopní prepísať číselné údaje na osiach za text.

Vykreslenie ľavého horného grafy by vyzeralo teda nasledovne. Najprv vykreslíme obsah grafu:

figure
hold on
plot(time, ref, 'g')
plot(time, y2, 'k')
plot(time, y3, 'r')
grid on
legend('ref', 'PID 2', 'PID 3', 'location', 'SouthEast')
xlabel('Time [s]')
ylabel('Height [m]') 

Potom si do premenných nadefinujeme rozsahy a ostatné hodnoty potrebné pre formátovanie. Ako prvé si potrebujem určiť rozsah y-ovej osi. Vhodný rozsah by bol od 0 po 1.4, čiže rozsah v absolútnej hodnote je 1.4. Následne chceme aby sa os začala číslovať od 0 a skončilo sa číslovanie pri 1.4. Ideálny krok, s ktorým sa bude os číslovať je 0.2, ale rovnako tak môžeme nastaviť iné vhodné číslo. (V MATLAB-e ale aj iných softwaroch je hodnota, ktorá sa vyskytuje na osiach pomenovaná ako Tick.)

% y range:
y_range = 1.4;

% y limits for nice figure:
y_min   = 0.0 - 0.1*y_range;
y_max   = 1.4 + 0.1*y_range;

% y ticks settings:
yt_min  = 0.0;
yt_max  = 1.4;
yt_step = 0.2;

% apply settings
set(gca, 'Ylim', [y_min, y_max], 'Ytick', yt_min:yt_step:yt_max);

% print figure
print(gcf, '-dpng', 'y1_new')

Aby sme si rozobrali vyššie uvedený zdrojový kód, tak ako prvé si zadefinujem rozsah y-ovej osi. Následne si vypočítam o koľko chceme zvačšíť tento rozsah, aby krivky "viseli" v priestore,
ja osobne som zvyknutý zvačšíť rozsah y-osi na grafe o 10% nahor a nadol, z toho dovodu sa objavil ten výpočet 0.0 - 0.1*y_range. Príkaz set(gca, ...) aplikuje a mení nastavenia grafov. Obsahuje rôzne možnosti v závislosti, akému objektu ideme meniť nastavenia. V našom prípade ideme meniť nastavenia objektu, ktorý sa v MATLAB-e označuje ako axes - vykreslený graf, pozor toto je iba to biele pole s mirežkou, krivkami a osami, nie celý figure. Funkciou gca tým pádom určíme, že sa idú meniť parametre posledného otvoreného objeku axes (gca - get current axes). Následne špecifikujeme, aký paramater grafu chceme zmeniť. Ako prvé mením rozsah na y-ovej osi, čiže Ylim, potom nasledujú dve dhonoty vo vektore, minimálna a maximálna. Ako druhé chceme vynútiť mriežku na y-ovej osi, a to spravíme pomocou parametra Ytick, kde jeho argumentom je postupnosť čísel, ktoré chceme aby sa objavili na y-ovej osi. Ak je potrebné, môžeme tam napísať [0, 1, 1.2]. Aký bude teda výsledok, keď tento postup aplikujeme aj na ostatné grafy? Pozrime sa na tento obrázok:
ukazka snimku 3

Čo je teda záverom? Teraz na tomto "slajde" na prvý pohľad vidno rozdiely medzi jednotlivými priebehmi, bez toho aby sme si museli špekulovať nad tým či náhodou nie je zmenená mierka grafu. Ako druhé sme graf naformátovali tak, že krivky "visia" v priestore. Grafy teda vyzerajú profesionálne a navyše je z nich na prvý pohľad vidno, ktorý regulátor je najlepší a aké má korešpondujúce akčné zásahy.

A ešte jedna vec na záver. Keď budete dávať viac grafov na jeden slajd, alebo stranu tak si ich zarovnajte. Nielen na základe okrajov, ale aj na základe osí. Ak by mali mať aj y-osi grafov vedľa seba iný rozsah, tak nech prvý a posledný Tick na oboch grafoch začína v tej istej výške.