IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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.worldban­k.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:

Graf v MATLAB - Matlab

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.

Popísaný graf v MATLAB - Matlab

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í:

Štýl čiary a popisky osí grafu v MATLAB - Matlab

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:

Zobrazenie stebiel v grafu v MATLAB - Matlab

Ď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):

Veľký voz v MATLAB - Matlab

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:

Hviezdna obloha v MATLAB - 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:

Podgraf v MATLAB - Matlab

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.

Domček jedným ťahom pomocou funkcie plot v MATLAB - Matlab

 

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

 

Predchádzajúci článok
Cykly a maticový prístup v MATLAB
Všetky články v sekcii
Matlab
Článok pre vás napísal tesař.tech
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje dýchání přibližně celý život
Aktivity