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.worldbank.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:

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.

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:

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:

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

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:

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:

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.

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 23x (2.5 kB)
Aplikace je včetně zdrojových kódů