KTE / PPEL Počítačová podpora v elektrotechnice 3. 12. 2014 Ing. Lenka Šroubová, Ph.D. email: lsroubov@kte.zcu.cz http://home.zcu.cz/~lsroubov Grafy, úprava, popisky, vizualizace výsledků výpočtů opakování a pokračování - vyhlazení hran barevných grafů u plošného grafu surf. shading faceted výchozí stav, nevyhlazené, vykreslené hrany shading flat nevyhlazené, bez vykreslených hran shading interp vyhlazené s barevnými přechody, bez vykreslených hran Např. [X,Y] = meshgrid(-3:0.05:-1,2:0.05:3); Z = sin(x.^2).* ((sin(x) - cos(y))./ cos(y)); subplot(1,2,1) surf(x,y,z) subplot(1,2,2) surf(x,y,z) shading interp colormap(paleta) nastavuje barevnou paletu pro graf - parametr paleta je matice o 3 sloupcích představujících Red Green Blue, položky mají hodnoty od 0 do 1 (tj. 0 až 100%) - předpřipravené palety gray, hot, copper, hsv, cool
Statistika bar sloupcový graf pie výsečový (koláčový) graf Příklad: V bufetu bylo za 15 minut prodáno 10 rohlíků, 20 baget, 30 koblih a 5 kusů ostatního pečiva. Vytvořte výsečový graf, který ukáže podíl prodaného druhu pečiva. pecivo=[10,20,30,5]; subplot(2,2,1) pie(pecivo) subplot(2,2,2) pie(pecivo,{'rohliky','bagety','koblihy','ostat ni'}) subplot(2,2,3) ex=[0,1,0,0] pie(pecivo,ex) subplot(2,2,4) pie(pecivo,[1,1,1,1],{'rohliky','bagety','kobli hy','ostatni'})
Vykreslete rovněž prodané pečivo ve formě sloupcového grafu pecivo=[10,20,30,5]; bar(pecivo) Příklad: V bufetu bylo za 15 minut prodáno 10 rohlíků, 20 baget, 30 koblih a 5 kusů ostatního pečiva, ve druhé prodejně bylo prodáno za stejnou dobu prodáno 8 rohlíků, 12 baget, 4 koblih a 15 kusů ostatního pečiva a ve třetí prodejně bylo prodáno opět za stejnou dobu prodáno 20 rohlíků, 4 bagety, 7 koblih a 5 kusů ostatního pečiva. Vykreslete poměrné zastoupení prodaného pečiva v jednotlivých prodejnách.
prodejna=[10,20,30,5; 8,12,4,15; 20,4,7,5] subplot(1,2,1) bar(prodejna,'stacked') legend('rohliky','bagety','koblihy','ostatni') subplot(1,2,2) bar(prodejna,'grouped') legend('rohliky','bagety','koblihy','ostatni') Příklady viz http://portal.zcu.cz nebo http://home.zcu.cz/~lsroubov/ppel Grafy zobrazující vztah částí k celku bar sloupcový graf barh sloupcový graf horizontální
pie výsečový (koláčový) graf bar3 trojrozměrný sloupcový graf (v MATLABu) pie3 trojrozměrný výsečový (koláčový) graf ( v MATLABu) Příklady viz http://portal.zcu.cz m-file k přednáškám Další typy grafů stairs "schodový" graf hist graf vyjadřující u spojité proměnné rozdělení četností podle intervalů hodnot. hist(y) rozdělí prvky y na 10 rovnoměrně rozložených intervalů a vrací počet prvků v každém intervalu. hist(y,x), kde x je vektor, vrátí rozdělení y mezi intervaly s centry určenými x rose úhlový histogram errorbar chybové úsečky ukazují úroveň spolehlivosti dat nebo odchylku podél křivky. feather graf zobrazující vektory vycházející z bodů rovnoměrně rozložených podél vodorovné osy, tj. z [0,0], [1,0], [2,0], a další viz help Příklady: x = linspace(-2*pi,2*pi,40); stairs(x,sin(x))
x = -5:0.1:5; y = randn(1000,1); hist(y,x)
x = linspace(-2*pi,2*pi,40); feather(x,sin(x)) grid x = linspace(0,2*pi,10); y = sin(x); er = std(y)*ones(size(x)); errorbar(x,y,er) Příklady viz http://portal.zcu.cz
Další typy grafů Příklad: Vektory a = [-5,5], b = [2,6] compass([-5,2],[5,6]) Pro komplexní čísla viz 4. přednáška Jiné grafy ve formě šipek quiver, quiver3 viz 10. přednáška Grafy pro snadné použití fplot(fun,lims) graf funkce FUN mezi body na ose x stanovené vektorem LIMS = [xmin,xmax], jako první parametr - lze zadat do apostrofů pravou stranu funkce, druhý parametr je vektor o dvou prvcích [od, do], např.: fplot('x.^2+3',[-5, 5]) - zadat odkaz na vestavěnou funkci (@nazev_funkce), druhý parametr je vektor o dvou prvcích [od, do], např.: fplot(@sin,[-5, 5]) - zadat odkaz na vlastní funkci (@nazev_funkce), druhý parametr je vektor o dvou prvcích [od, do], např.:
Vytvořím uživatelskou funkci sin2x2: function y=sin2x2(x) y=(sin(x.^2)).^2; end A odkaz na tuto funkci v příkazu fplot fplot(@sin2x2,[-5, 5]) - viz též funkce ezplot, ezmesh, ezsurf a další kde ez značí easy-to-use ezplot(fun) vykreslí grafy funkcí FUN(X) pro výchozí hodnoty -2π < x < 2π, např.: ezplot('x.^2+4.*x+3') Podobně např. ezsurf('x*exp(-x^2 - y^2)')
Zobrazení vlastní funkce, např. function z = moje(x,y,k1,k2,k3) z = x.*(y.^k1)./(x.^k2 + y.^k3); Pokud má vlastní uživatelská funkce více parametrů, je třeba určit, které se budou vykreslovat na osách @(x,y), např.: ezsurf(@(x,y)moje(x,y,3,4,2)) Další typy grafů [X,Y,Z]=sphere vytvoření povrchu koule [X,Y,Z]=cylinder vytvoření povrchu válce (3D grafy se zobrazí příkazy mesh(x,y,z) nebo surf(x,y,z)) alpha průhlednost grafu 0 je úplně průhledný a 1 je neprůhledný (viz výchozí stav) v MATLABu Příklad: surf(cylinder)
alpha(0.4) % průhlednost 40% Příklad: Vykreslení průběhů funkcí sin(t), cos(t) a vlastní funkce sin 2 t 2 použitím příkazu fplot function demo_funkce while (1) kterou = input('kterou funkci ukazat (0 pro ukonceni): '); switch kterou case 0 break; case 1 fprintf('\nbudeme kreslit sinus.\n'); testf = @sin; case 2 fprintf('\nbudeme kreslit cosinus.\n'); testf = @cos; case 3 fprintf('\nbudeme kreslit sin na 2 x na 2.\n');
testf = @sin2x2; otherwise fprintf('\ntakovou funkci tu nemam.\n'); continue; end; t = [0:0.1:2*pi]; y = testf(t); if (exist('graf')) close(graf); clear graf; end; graf = figure; plot(t,y); end; close(graf) fprintf('\nnashledanou, hezky den...\n'); Ve funkci demo_funkce je volána funkce: function y=sin2x2(x) y=(sin(x.^2)).^2; Poznámky: - znak @ obecně slouží pro vytvoření odkazu (reference) na funkci - exist('nejak_promenna') test zda nějaká proměnná existuje (vrací 0 nebo 1 tj. ne / ano) figure vytvoří prázdné grafické okno - není nutný v případě, že není otevřeno žádné okno stačí kterýkoliv grafický příkaz a výpočetní systém okno grafu vytvoří, aby bylo kam kreslit. - pokud už nějaký graf existuje, grafické příkazy kreslí do okna, které je vybrané to naposledy otevřené. - figure vždy otevře nové okno a vybere ho, do něj se potom kreslí - v MATLABu lze vybrat graf též myší to je vhodné jen z příkazového řádku, ne z programu - pokud je třeba znát číslo otevřeného grafu, lze zjistit takto: cislo_grafu = figure
cislo_grafu = 5 - výběr grafu pro práci, např. z funkce cislo_grafu = figure(1) % bude se pracovat s grafem 1 figure(cislo_grafu) % bude se pracovat s grafem 1 - číslu grafu (figury) MATLAB říká "figure handle" close zavře aktuální grafické okno close(cislo_grafu) zavře grafické okno s udaným číslem close all zavře všechny otevřená grafická okna Příklad: Po následujících příkazech budou otevřena 2grafická okna s grafy: close all a=figure b=figure a = 1 b = 2 figure(a) plot(5,3,'ro','markersize',30,'linewidth',3) figure(b) fplot(@sin,[-3,3]) figure(a) hold on plot(6,2,'k*','markersize',30,'linewidth',3) hold off figure(b) hold on fplot(@cos,[-3,3],'g')
hold off figure(a) hold on plot(1,1,'cv','markersize',30,'linewidth',3) grid hold off c=figure c = 3 close(3) Pozn. Jako parametr příkazu plot 'LineWidth',5 nastavuje tloušťku čáry 'MarkerSize', 16 nastavuje velikost značky get(cislo_grafu) vypíše všechny informace o grafu get(cislo_grafu, 'Nazev vlastnosti') vypíše hodnotu dané vlastnosti Např.: get(cislo_grafu, 'Color')
Nastavení hodnoty vlastnosti: set(cislo_grafu, 'Nazev vlastnosti', hodnota_vlastnosti) Např.: set(cislo_grafu, 'Color', [0.8, 0.8, 0.8]) nastavena barva RGB 80% 80% 80% (procenta červené, modré a zelené barvy) Podobně i plot vrací informace o grafu, je-li v grafu více grafických objektů, jedná se o sloupcový vektor. x = 0:2*pi; dp = plot(x,sin(x)); get(dp) vypíše všechny informace o grafu set(dp,'nazev vlastnosti',hodnota_vlastnosti) nastavení hodnoty vlastnosti Příklad: Vykreslení paraboly zadané parametrickými rovnicemi x = -2 + t, y = -1 + t 2, pro t od -5 do 5. t=-5:0.1:5; x=-2+t; y=-1+t.^2; dp=plot(x,y,'r','linewidth',5);
set(dp,'color',[0.7,0.6,0.8]) Pozn.: Chceme-li získat rovnici této paraboly ve tvaru y = ax 2 + bx + c, lze použít příkaz polyfit(x,y,2) ans = 1.0000 4.0000 3.0000 tedy rovnice paraboly je y = x 2 + 4x + 3 a tentýž graf bychom získali pro x od 7 do 3 (vypočteno z rovnice x = -2 + t pro t = -5 a t = 5). x=[-7:0.1:3]; y=x.^2+4.*x+3; plot(x,y)