Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 6 - Zobrazení grafů v MATLABu

MATLAB je určen pro práci s daty velice rozličných typů. V této lekci si ukážeme jak zobrazit data dvourozměrná. Vhodné zobrazení častokrát řekne více, nežli prostá tabulka s hodnotami. Pro tyto účely obsahuje MATLAB sadu funkcí, které bez zdlouhavých ceremonií poskytnou patřičné informace v grafické podobě.

Načtení dat

Pro účely této lekce budeme využívat data vývoje české populace v letech 1960 až 2018. Ta jsou legálně zkopírovaná z data.worldban­k.org. Data načteme z přiloženého souboru populaceCR.mat funkcí load(). Soubor musí být v aktuální složce, se kterou MATLAB pracuje (Current Folder), nebo uveden s absolutní cestou. Po načtení se ve Workspace objeví proměnné s názvem muzi a zeny obsahující 59 hodnot:

load populaceCR.mat % musi byt v aktualni slozce
roky = 1960:2018;

Spojitý graf – Funkce plot()

Bez dalšího zahálení můžeme rovnou zobrazit vývoj mužské části populace:

plot(muzi)

Otevře se nám nové okno (říkáme mu figura) s grafem, který odpovídá předloženým datům:

Graf v MATLAB - Matlab

Funkci plot() jsme předhodili jediný parametr – data, která chceme zobrazit. Se stylem zobrazení, barvou křivky, přiblížením, osou y a pozadím se vypořádala funkce sama. Pochopitelně toho spoustu neví, a tak na ose x jsou místo roků pouze indexy, osy nemají popisky, chybí titulek a jiné věci, které bychom třeba očekávali. Všechna zmíněná a mnohá jiná nastavení se dají pochopitelně upravit.

Nyní vykreslíme graf včetně vývoje populace žen a "ozdobíme" ho všemi potřebnými informacemi:

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');

Přijímá – li funkce plot() 2 a více parametrů, první z nich je brán jako data pro osu x (už se tam nebudou zobrazovat pouze indexy, ale roky, tak jak jsme je definovali na začátku). Druhý parametr jsou známé hodnoty vývoje populace. Třetím parametrem je barva výsledné křivky. Funkce hold() s přepínačem on slouží k zadržení aktuálního grafu. Kdybychom tento řádek vynechali, modrá křivka bude přemazána křivkou následující (červenou). Funkce legend() umístí do grafu popisky křivek (respektuje pořadí, ve kterým byly vykresleny). title(), jak už název napovídá, nastaví titulek.

Popsaný graf v MATLAB - Matlab

Následující kód má téměř stejný výsledek jako kód předchozí. Ukazuje další možnosti zobrazení těch stejných dat:

plot(roky, muzi,'b--',roky,zeny, 'r:')
grid on ;
xlabel('roky');ylabel('pocet obyvatel')

hold on zde obcházíme pomocí sloučení dvou volání funkce plot(). Za definicí barvy se nachází definice křivky. Dvě pomlčky (--) znamenají čerchovanou čáru, dvojtečka čáru tečkovanou. Funkce grid s parametrem on zobrazí mřížku pro snadnější orientaci v grafu. xlabel a ylabel nastaví popisky os:

Styl čáry a popisky os grafu v MATLAB - Matlab

Funkce stem() a Husákovy děti na populační křivce

Chceme-li na křivce zdůraznit některé hodnoty, můžeme k tomu využít funkci 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])

Nejdříve jsme si definovali proměnnou soucet, která obsahuje kompletní českou populaci. Následně jsme využili funkci min() k nalezení nejmenšího absolutního rozdílu mezi velikostí populace a hodnotou deseti milionů. Takto získáme rok, kdy se populace přiblížila nejvíce právě zmíněné hodnotě. Funkcí stem(), která přijímá parametry pro x-ovou a y-ovou souřadnici, zobrazíme "stéblo" se zaměřením právě na danou hodnotu v grafu:

Zobrazení stébel v grafu v MATLAB - Matlab

Dále zvýrazníme rok 1970, který má důležité místo při studiu populační vlny nazývané Husákovy děti (povšimněte si zvyšování populace právě po roce 1970). Funkce axis slouží k definování minima a maxima zobrazovaného prostoru pro obě osy. Jelikož funkce stem() vytváří stébla od 0, bylo by na grafu vidět jen málo detailů. Tímto způsobem posuneme zobrazení kousek od minima a maxima našich dat.

scatter() – Graf dvou proměnných

Funkce plot() nám kreslí křivky, stem() zvýrazňuje určité hodnoty. Funkce scatter() (v češtině korelační diagram) umí v kartézských souřadnicích zobrazit hodnoty dvou proměnných. Takovými hodnotami mohou být například souřadnice hvězd na obloze určitého souhvězdí (Velký vůz):

Velký vůz v MATLAB - Matlab

Kód bude následující:

x = [337,316,249,205,146,83,29];
y = [147,205,103,151,131,125,65];
scatter(x,y)
axis([0,384,0,285]);

Proměnné x a y jsem vyčetl ze souřadnic pixelů fotografie noční oblohy (žádná velká věda ani přesnost). A je zde skutečně vidět tvar souhvězdí Velkého vozu. To je ale pouze primitivní použití funkce scatter(). Nyní posuneme noční oblohu o úroveň výše.

scatter() - Velký vůz na noční obloze

Nastavíme černou barvu pozadí, z koleček uděláme hvězdy, které zároveň pojmenujeme a jejich svítivost podložíme reálnými daty. Také využijeme známé funkce plot() pro náčrt čar mezi hvězdami a odstraníme čísla na osách. To vše pro demonstraci možností zobrazení dat v MATLAB:

Hvězdná obloha v MATLAB - Matlab

Názvy hvězd bdících na vrcholcích Velkého vozu snadno dohledáme. U detailu každé z nich můžeme vyčíst hvězdnou velikost, která hovoří o tom, jak moc je hvězda při pohledu na oblohu jasná. V kódu se tato hodnota objevuje pod proměnnou m, čím nižší, tím se hvězda jeví svítivější. Abychom hvězdnou velikost mohli využít pro zobrazení v grafu, musíme z ní vypočítat světelný tok (pro účely této lekce to není příliš podstatné). Kromě proměnných x a y přijímá funkce scatter() ještě velikost zobrazených bodů, což je přesně náš světelný tok, a barvu a styl zobrazených bodů - v tomto případě bílá (white) hvězda (*). Aktuální figuře, která se skrývá se pod proměnnou gca, nastavíme černé pozadí (blacK nebo Key, jelikož b je rezervováno pro modrou), a odstraníme čísla na obou osách (nastavením XTick a YTick jako prázdný vektor). Funkci text() předhodíme zas souřadnice hvězd, lehce upravené tak, aby se text zobrazoval vpravo pod hvězdou. Nastavíme barvu v RGB formátu na zeleno-modrou a velikost textu na 8 pixelů.

Posledním krokem je "vyplocení" kontury souhvězdí. Nemůžeme pouze využít funkci plot() na souřadnici hvězd. Musíme správně určit pořadí. Povšimněte si, že 4. hvězda je ve vektoru 2x. To je přesně místo, kde se pojí oj s koly:

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() – více grafů v jednom okně

Funkce subplot() slouží k vykreslení pouze do určité části figury. Přijímá 3 parametry. Prvními dvěma rozdělí okno do mřížky a třetím určí, do které buňky se následující objekt zapíše:

Podgrafy v MATLAB - Matlab

Využijeme zde souhvězdí z předchozí úlohy a pokaždé jej zakreslíme jinou barvou:

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žení grafů

K uložení grafů slouží funkce saveas(). Buď jako obrázek nebo soubor s koncovkou .fig, který je pak možné otevřít na jiném stroji s nainstalovaným MATALAB a zobrazit a manipulovat s ním bez nutnosti spouštět zdrojový kód:

set(figura_hvezdy, 'InvertHardCopy','off'); %ponechat cerne pozadi
saveas(figura_hvezdy,'hvezdy.png')
saveas(figura_hvezdy,'hvezdy.fig');

Závěr

Představili jsme způsoby zobrazení dvourozměrných dat a mnohá nastavení, která se ke grafům pojí. Jako cvičení zkuste nakreslit domeček jedním tahem pomocí funkce plot(). Řešení, stejně jako ucelený a okomentovaný zdrojový kód z dnešní lekce a data k ní naleznete v přiloženém souboru.

Domeček jedním tahem pomocí funkce plot v MATLAB - Matlab

 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 22x (2.5 kB)
Aplikace je včetně zdrojových kódů

 

Předchozí článek
Cykly a maticový přístup v MATLAB
Všechny články v sekci
Matlab
Článek pro vás napsal tesař.tech
Avatar
Uživatelské hodnocení:
2 hlasů
Autor se věnuje dýchání přibližně celý život
Aktivity