6. diel - Zobrazenie grafov v MATLAB
MATLAB je určený pre prácu s dátami veľmi rozličných typov. V tejto lekcii si ukážeme ako zobraziť dáta dvojrozmerná. Vhodné zobrazenie častokrát povie viac, než prostá tabuľka s hodnotami. Pre tieto účely obsahuje MATLAB sadu funkcií, ktoré bez zdĺhavých ceremónií poskytnú príslušné informácie v grafickej podobe.
Načítanie dát
Pre účely tejto lekcie budeme využívať dáta vývoja českej populácie
v rokoch 1960 až 2018. Tie sú legálne skopírované z data.worldbank.org.
Dáta načítame z priloženého súboru populaceCR.mat
funkcií
load()
. Súbor musí byť v aktuálnej zložke, s ktorou MATLAB
pracuje (Current Folder), alebo uvedený s absolútnou cestou. Po načítaní sa
vo Workspace objavia premenné s názvom muzi
a zeny
obsahujúce 59 hodnôt:
load populaceCR.mat % musi byt v aktualni slozce roky = 1960:2018;
Spojitý graf - Funkcia plot ()
Bez ďalšieho Zahalená môžeme rovno zobraziť vývoj mužskej časti populácie:
plot(muzi)
Otvorí sa nám nové okno (hovoríme mu figúra) s grafom, ktorý zodpovedá predloženým dátam:
Funkciu plot()
sme predhodil jediný parameter - dáta, ktoré
chceme zobraziť. So štýlom zobrazenia, farbou krivky, priblížením, osou ya
pozadím sa vysporiadala funkcia sama. Pochopiteľne toho veľa nevie, a tak na
osi x sú namiesto rokov iba indexy, osi nemajú popisky, chýba titulok a iné
veci, ktoré by sme napríklad očakávali. Všetky spomínaná a mnohé iné
nastavenia sa dajú pochopiteľne upraviť.
Teraz vykreslíme graf vrátane vývoja populácie žien a "ozdobíme" ho všetkými potrebnými informáciami:
plot(roky,muzi,'b'); % b pro blue hold on; % graf se neprekresli, ale prikresli plot(roky,zeny,'r'); % r = red legend('muzi','zeny'); title('Populace v CR');
Prijíma - Ak funkcia plot()
2 a viac parametrov, prvý z nich
je braný ako dáta pre os x (už sa tam nebudú zobrazovať iba indexy, ale
roky, tak ako sme ich definovali na začiatku). Druhý parameter sú známe
hodnoty vývoja populácie. Tretím parametrom je farba výslednej krivky.
Funkcia hold()
s prepínačom on
slúži k zadržaniu
aktuálneho grafu. Keby sme tento riadok vynechali, modrá krivka bude
premazanie krivkou nasledujúce (červenou). Funkcia legend()
umiestni do grafu menovkami kriviek (rešpektuje poradie, vo ktorým boli
vykreslené). title()
, ako už názov napovedá, nastaví
titulok.
Nasledujúci kód má takmer rovnaký výsledok ako kód predchádzajúce. Ukazuje ďalšie možnosti zobrazenia tých rovnakých dát:
plot(roky, muzi,'b--',roky,zeny, 'r:') grid on ; xlabel('roky');ylabel('pocet obyvatel')
hold on
tu obchádzame pomocou zlúčenie dvoch volanie funkcie
plot()
. Za definíciou farby sa nachádza definícia krivky. Dve
pomlčky (--
) znamenajú prerušovanou čiaru, dvojbodka čiaru
bodkovaný. Funkcia grid
s parametrom on
zobrazí
mriežku pre ľahšiu orientáciu v grafe. xlabel
a
ylabel
nastaví popisky osí:
Funkcia stem () a Husákovej deti na populačnej krivke
Ak chceme na krivke zdôrazniť niektoré hodnoty, môžeme k tomu využiť
funkciu stem()
:
soucet = zeny +muzi; plot(roky,soucet);hold on; [~, ind] = min(abs(soucet-1e7)); stem(roky(ind),soucet(ind)); %kdy je populce nejbize k 10 M stem(1970,soucet(1970-min(roky)+1)) axis([min(roky)-1 max(roky)+1 min(soucet)-1e5 max(soucet)+1e5])
Najskôr sme si definovali premennú soucet
, ktorá obsahuje
kompletnú slovenskú populáciu. Následne sme využili funkciu
min()
na nájdenie najmenšieho absolútneho rozdielu medzi
veľkosťou populácie a hodnotou desiatich miliónov. Takto získame rok, kedy
sa populácia priblížila najviac práve spomínané hodnote. Funkciou
stem()
, ktorá prijíma parametre pre x-ovú a y-ovú súradnicu,
zobrazíme "steblo" so zameraním práve na danú hodnotu v grafe:
Ďalej zvýrazníme rok 1970, ktorý má dôležité miesto pri štúdiu
populačnej vlny nazývané Husákovej deti
(všimnite si zvyšovanie populácie práve po roku 1970). Funkcia
axis
slúži na definovanie minima a maxima zobrazeného priestoru
pre obe osi. Keďže funkcia stem()
vytvára steblá od
0
, bolo by na grafe vidieť len málo detailov. Týmto spôsobom
posunieme zobrazenie kúsok od minima a maxima našich dát.
Scatter () - Graf dvoch premenných
Funkcia plot()
nám kreslí krivky, stem()
zvýrazňuje určité hodnoty. Funkcia scatter()
(v češtine
korelačný diagram) vie v karteziánskych súradniciach zobraziť hodnoty dvoch
premenných. Takými hodnotami môžu byť napríklad súradnice hviezd na
oblohe určitého súhvezdia (Veľký voz):
Kód bude nasledujúci:
x = [337,316,249,205,146,83,29]; y = [147,205,103,151,131,125,65]; scatter(x,y) axis([0,384,0,285]);
Premenné x
a y
som vyčítal zo súradníc pixelov
fotografie nočnej oblohy (žiadna veľká veda ani presnosť). A je tu
skutočne vidieť tvar súhvezdia Veľkého vozidla. To je ale iba primitívne
použitie funkcie scatter()
. Teraz posunieme nočnú oblohu o
úroveň vyššie.
Scatter () - Veľký voz na nočnej oblohe
Nastavíme čiernu farbu pozadia, z koliesok urobíme hviezdy, ktoré
zároveň pomenujeme a ich svietivosť podložíme reálnymi dátami. Tiež
využijeme známe funkcie plot()
pre náčrt čiar medzi hviezdami
a odstránime čísla na osiach. To všetko pre demonštráciu možností
zobrazenia dát v MATLAB:
Názvy hviezd bdieť na vrcholkoch Veľkého vozu ľahko vyhľadáme. U detailu
každej z nich môžeme vyčítať hviezdnu veľkosť,
ktorá hovorí o tom, ako veľmi je hviezda pri pohľade na oblohu jasná. V
kóde sa táto hodnota objavuje pod premennú m
, čím nižšia,
tým sa hviezda javí svietivejšie. Aby sme hviezdnu veľkosť mohli využiť
pre zobrazenie v grafe, musíme z nej vypočítať svetelný tok (pre účely
tejto lekcie to nie je príliš podstatné). Okrem premenných x
a
y
prijíma funkcie scatter()
ešte veľkosť
zobrazených bodov, čo je presne náš svetelný tok, a farbu a štýl
zobrazených bodov - v tomto prípade biela (white) hviezda (*
).
Aktuálne figúre, ktorá sa skrýva sa pod premennou gca
,
nastavíme čierne pozadie (blac K alebo K ey,
pretože b
je rezervované pre modrú), a odstránime čísla na
oboch osiach (nastavením XTick
a YTick
ako prázdny
vektor). Funkciu text()
předhodíme zas súradnice hviezd, ľahko
upravené tak, aby sa text zobrazoval vpravo pod hviezdou. Nastavíme farbu v
RGB formáte na zeleno-modrú a veľkosť textu na 8 pixelov.
Posledným krokom je "vyplocení" kontúry súhvezdí. Nemôžeme len
využiť funkciu plot()
na súradnici hviezd. Musíme správne
určiť poradie. Všimnite si, že 4. hviezda je vo vektore 2x. To je presne
miesto, kde sa spája oj s kolesami:
nazvy_hvezd = {'Merak', 'Dubhe', 'Phecda', 'Megrez', 'Alioth', 'Mizar', 'Alkaid'}; m = [2.37, 1.79, 2.44, 3.312, 1.77, 3.88 ,1.86]; I0 = 500; %svetelny tok nejsvitivejsi hvezdy (s m = 0) svetelny_tok =power(10, -m/2.5 + log10(I0)); %vzorec pro vypocet svetelneho toku x = [337,316,249,205,146,83,29]; %souradnice hvezd y = [147,205,103,151,131,125,65]; figura_hvezdy = figure; %ulozeni figury do promenne pro ulozeni scatter(x,y,svetelny_tok,'w*') axis([0,384,0,285]); set(gca,'Color','k','XTick',[],'YTick',[]) %cerna barva, cisla pryc text(x+5,y-4,nazvy_hvezd,'Color',[0 1 0.8],'FontSize',8) %popisky hvezd hold on; poradi = [4,3,1,2,4,5,6,7]; plot(x(poradi),y(poradi),'LineWidth',1) %kontura souhvezdi pbaspect([348 285 1]) %udrzi pomer stran
Subplot () - viac grafov v jednom okne
Funkcia subplot()
slúži na vykreslenie len do určitej časti
figúry. Prijíma 3 parametre. Prvými dvoma rozdelí okno do mriežky a tretím
určí, do ktorej bunky sa nasledujúci objekt zapíše:
Využijeme tu súhvezdí z predchádzajúcej úlohy a zakaždým ho zakreslíme inou farbou:
figure; %fce figure vytvori nove okno subplot(2,2,1);plot(x(poradi),y(poradi),'red','LineWidth',5) title('2 radky, 1 sloupec, 1. bunka') subplot(2,2,2);plot(x(poradi),y(poradi),'green','LineWidth',5) title('2 radky, 1 sloupec, 2. bunka') subplot(2,1,2);plot(x(poradi),y(poradi),'black','LineWidth',5) title('dva radky, jeden sloupec, druha bunka')
Uloženie grafov
Na uloženie grafov slúži funkcia saveas()
. Buď ako obrázok
alebo súbor s koncovkou .fig
, ktorý je potom možné otvoriť na
inom stroji s nainštalovaným MATALAB a zobraziť a manipulovať s ním bez
nutnosti spúšťať zdrojový kód:
set(figura_hvezdy, 'InvertHardCopy','off'); %ponechat cerne pozadi saveas(figura_hvezdy,'hvezdy.png') saveas(figura_hvezdy,'hvezdy.fig');
Záver
Predstavili sme spôsoby zobrazenia dvojrozmerných dát a mnohé nastavenia,
ktoré sa ku grafom spája. Ako cvičenie skúste nakresliť domček jedným
ťahom pomocou funkcie plot()
. Riešenie, rovnako ako ucelený a
okomentovaný zdrojový kód z dnešnej lekcie a dáta k nej nájdete v
priloženom súbore.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 22x (2.5 kB)
Aplikácia je vrátane zdrojových kódov