2. Grafika 2.1 Úvod Hlavní funkcí na vykreslování grafů je funkce plot. Jako argumenty má dva vektory (stejné dimenze), první pro osu x, druhý pro osu y. x = 0:0.1:2*pi; y = sin(x); plot(x,y) otevře se nové okno s nápisem Figure. V něm je možné graf dále upravovat, editovat, přidat popisek, atd. Graf vybereme (bílá šipka select object), příkaz Edit/Current object properties. Většinu editačních změn je možné dělat i programově. title('sinusovka'); grid do aktuální Figure můžeme přidat další graf. Aby nevznikla automaticky další Figure, musíme zadat příkaz hold. y2 = cos(x); hold Current plot held plot(x,y2) Když je obrázek hotov, můžeme ho uložit přímo v menu File/Save as v různých formátech. Uložení je možné provést i z příkazové řádky příkazem print: print -djpeg -f1 -r300 figure uloží figure1 (f1) v rozlišení 300dpi jako 24-bitový JPG do souboru figure.jpg export do clipboardu z příkazové řádky print dmeta print dbitmap 2.2 typy grafů 2D plot - jednoduchý 2D graf loglog - graf s log. souřadnicemi semilogx - graf,kde x má log. souřadnice semilogy - graf,kde y má log. souřadnice plotyy - graf s hlavní a vedlejší osou y x = 1:1:1000;
y = log(x); plot(x,y) loglog(x,y) semilogx(x,y) dvě y osy (vpravo/vlevo) 2.3 Více grafů v jednom obrázku Příkaz subplot(m,n,p) x = 0:0.1:2*pi; y1 = sin(x); y2 = cos(x); y3 = 2*y1; y4 = 0.5*y1; y5 = log(y1); Warning: Log of zero. y6 = y1.^2; subplot(3,2,1) plot(x,y1); subplot(3,2,2) plot(x,y2); subplot(3,2,3) plot(x,y3); subplot(3,2,4) plot(x,y4); subplot(3,2,5) plot(x,y5); Warning: Imaginary parts of complex X and/or Y arguments ignored. subplot(3,2,6) plot(x,y6); 2.4 příkaz Plot podrobněji varianty plot(x,y) základní verze plot(y) x-ová osa jsou indexy prvků plot(x,y,s) s obsahuje formátovací řetězec příklad x = -pi:pi/10:pi; y = tan(sin(x)) - sin(tan(x)); plot(x,y,'--rs') // čerchovaná čára, červená, čtverec jako marker
Symbol Barva Symbol Ukazatel Symbol Styl čáry b modrá. Bod - plná g zelená o kruh : tečkovaná r červená x kříž -. čerchovaná c modrozelená + plus -- čárkovaná m fialová * hvězda y žlutá s čtverec k černá d diamand w bílá v trojúhelník (dolů) ^ trojúhelník (nahoru) > trojúhelník (vpravo) < trojúhelník (vlevo) p pentagram h hexagram (nahoru) další parametry je možné zadávat pomocí formátovacích proměnných příklad x = -pi:pi/10:pi; y = tan(sin(x)) - sin(tan(x)); plot(x,y,'--rs', 'LineWidth',2,... 'MarkerEdgeColor','k',... 'MarkerFaceColor','g',... 'MarkerSize',5) 2.5 plotyy Příkaz umožňuje použít dvě nezávislé osy y. Všimněme si že příkaz vrací handly na jednotlivé objekty. (m2_1.m) t = 0:900; A = 1000; a = 0.005; b = 0.005; z1 = A*exp(-a*t); z2 = sin(b*t); [haxes,hline1,hline2] = plotyy(t,z1,t,z2,'semilogy','plot'); axes(haxes(1)) ylabel('semilog Plot') axes(haxes(2)) ylabel('linear Plot') set(hline2,'linestyle','--') 2.6 data v matici x = 1:10; % vektor 1-10 y = randn(10); % matice 10x10 náhodných hodnot plot(x,y) % vytvoří deset grafů do jednoho obrázku 2.7 Speciální grafy sloupcové grafy
bar barh bar3 bar3h area zobrazuje sloupce matice m x n jako m skupin do n svislých sloupců totéž horizontálně totéž 3D totéž horizontálně 3D plocha Příklady Jeden sloupec dat více sloupců 3D horizontálně x = -2.9:0.2:2.9; Y = [ 1 2 3; 5 7 8; 4 9 7;5 7 4]; Y = [ 1 2 3; 5 7 8; 4 9 7;5 7 4]; bar(x,exp(-x.*x),'r') bar(y) bar3h(y) Další možnosti (m2_2.m) Y = round(rand(5,3)*10); subplot(2,2,1) bar(y,'group') title 'Group' subplot(2,2,2) bar(y,'stack') title 'Stack' subplot(2,2,3) barh(y,'stack') title 'Stack' subplot(2,2,4) bar(y,1.5) title 'Width = 1.5' 2.7 Speciální grafy diskrétní data stem stem3 stairs diskrétní sekvence diskrétní sekvence z dat z roviny xz Příklad (m2_3.m) alpha =.02; beta =.5; t = 0:4:200; y = exp(-alpha*t).*cos(beta*t); subplot(2,2,1); % normální zobrazení plot(t,y) % diskrétní zobrazení subplot(2,2,2); stem(t,y) subplot(2,2,3); stairs(t,y)
2.8 plochy úvod Surf, contour, surfc (m2_4.m) [X,Y,Z] = peaks(30); % plocha surf(x,y,z); % vrstevnice contour(x,y,z); % plocha + vrstevnice surfc(x,y,z); % mapovani barev colormap hsv colormap gray podrobnější 3D graf data obrázek vlastní vykreslení mapování barev a algoritmus stínování světlo pohled na graf Z = peaks(20); figure h = surf(z) colormap hot shading interp set(h,'edgecolor','k') light('position',[-2,2,20]) lighting phong material([0.4,0.6,0.5,30]) set(h,'facecolor',[0.7 0.7 0],'BackFaceLighting','lit') view([30,25]) set(gca,'cameraviewanglemode','manual') osy axis([5 15 5 15-8 8]) set(gca,'zticklabel','negative Positive') poměr stran set(gca,'plotboxaspectratio',[2.5 2.5 1]) titulky xlabel('x Axis') ylabel('y Axis') zlabel('function Value') title('peaks') Čárový 3D graf funkce plot3(x,y,z) x,y,z jsou vektory shodné délky t = 0:pi/50:10*pi; plot3(sin(t),cos(t),t) axis square; grid on Čárový 3D graf funkce plot3(x,y,z) x,y,z jsou matice nxm shodné velikosti [X,Y] = meshgrid([-2:0.1:2]); % užitečná funkce meshgrid Z = X.*exp(-X.^2-Y.^2); plot3(x,y,z) 3D grafy podrobněji
Rozdíl mezi mesh() a surf() mesh = drátový model, surf = stínová plocha Z = peaks(30); mesh(z) figure surf(z) funkce dvou proměnných: meshgrid [X,Y] = meshgrid(-8:.5:8); %vytvoření sítě pro mesh R = sqrt(x.^2 + Y.^2) + eps; %matice R obsahuje vzdálenosti od středu + malá konstanta Z = sin(r)./r; % vytvoření dat mesh(x,y,z) tatáž data pomocí surf a vylepšení zobrazení surf(x,y,z,'facecolor','interp','edgecolor','none','facelighting','phong') daspect([5 5 1]) % nastaveni ascpet ratio pro jednotlive osy axis tight % nastavení os podle dat view(-50,30) % nastavení pohledu camlight left % nastavení světla vlevo a nahoru od kamery ostatní - legenda na 3D grafech Z = peaks(30); surf(z); colorbar % vytvoří barevnou škálu podle aktuální mapy barev colormap hot % změní barevnou mapu i škálu ostatní drátový model odstranění hidden lines Z = peaks(30); mesh(z); hidden off 2.9 animace Příkaz getframe vezme aktuální obraz a uloží ho jako n-tý frame do matice Příkaz movie přehraje danou matici n-krát movie(m,n) for k = 1:16 plot(fft(eye(k+16))) axis equal M(k) = getframe end movie(m,2) % jina animace Z = peaks; surf(z); axis tight set(gca,'nextplot','replacechildren'); % Record the movie
for j = 1:20 surf(sin(2*pi*j/20)*z,z) F(j) = getframe; end % Play the movie twenty times movie(f,20) 2.10 Zobrazení objemu Objemová data jsou uložena buď ve skalární podobě (x,y,z,hodnota) nebo jako vektory. Příklady dat v matlabu: [x,y,z,v] = flow; % rychlostní profil tekutiny ; % průběh větru nad severní amerikou Skalární data jsou nejlépe zobrazitelná jako izoplochy nebo konturové řezy, vektorová data mají směr i velikost pro každý bod, nejlépe je zobrazíme pomocí proudových čar nebo šipkových či kuželových grafů Skalární data - Konturové řezy [x y z v] = flow; h = contourslice(x,y,z,v,[1:9],[],[0],linspace(-8,2,10)); axis([0,10,-3,3,-3,3]); daspect([1,1,1]) camva(24); camproj perspective; campos([-3,-15,5]) set(gcf,'color',[.5,.5,.5],'renderer','zbuffer') set(gca,'color','black','xcolor','white', 'YColor','white','ZColor','white') jiný příklad na konturové řezy for i=1:10 for j=1:10 for k=1:10 value(i,j,k) = sin(i/4)*sin(j/4)*sin(k/4); end end; end; contourslice(value,[1:2:10],[1:2:10],[1:2:10]) campos([10,8,10]); ta stejná data pomocí izoploch figure slice(value,[1:2:10],[1],[1]); campos([10,8,10]); vylepšení izoplochy o interpolaci hsurfaces = slice(value,[1,4,6,8,10],[1],[1]);
set(hsurfaces,'facecolor','interp','edgecolor','none') campos([10,8,10]); vektorová data kuželový graf xmin = min(x(:)); xmax = max(x(:)); ymin = min(y(:)); ymax = max(y(:)); zmin = min(z(:)); daspect([2,2,1]) xrange = linspace(xmin,xmax,8); yrange = linspace(ymin,ymax,8); zrange = 3:4:15; [cx cy cz] = meshgrid(xrange,yrange,zrange); hcones = coneplot(x,y,z,u,v,w,cx,cy,cz,5); set(hcones,'facecolor','red','edgecolor','none') hold on wind_speed = sqrt(u.^2 + v.^2 + w.^2); hsurfaces = slice(x,y,z,wind_speed,[xmin,xmax],ymax,zmin); set(hsurfaces,'facecolor','interp','edgecolor','none') hold off axis tight; view(30,40); axis off camproj perspective; camzoom(1.5) camlight right; lighting phong set(hsurfaces,'ambientstrength',.6) set(hcones,'diffusestrength',.8) vektorová data streamy streamline [sx,sy,sz] = meshgrid(80,20:10:50,0:5:15); h = streamline(x,y,z,u,v,w,sx,sy,sz); set(h,'color','red') view(3) zobrazení v řezu, stream zobrazení pomocí markerů [sx sy sz] = meshgrid(80,20:1:55,5); verts = stream3(x,y,z,u,v,w,sx,sy,sz);
iverts = interpstreamspeed(x,y,z,u,v,w,verts,.2); sl = streamline(iverts); set(sl,'marker','.') axis tight; view(2); daspect([1 1 1]) streamparticles pohyb bodů podle rychlosti [sx sy sz] = meshgrid(80,20:1:55,5); verts = stream3(x,y,z,u,v,w,sx,sy,sz); sl = streamline(verts); iverts = interpstreamspeed(x,y,z,u,v,w,verts,.025); axis tight; view(30,30); daspect([1 1.125]) camproj perspective; camva(8) set(gca,'drawmode','fast') streamparticles(iverts,35,'animate',10,'particlealignment','on') totéž v řezu (z = 5) daspect([1 1 1]); view(2) [verts averts] = streamslice(x,y,z,u,v,w,[],[],[5]); sl = streamline([verts averts]); axis tight off; set(sl,'visible','off') iverts = interpstreamspeed(x,y,z,u,v,w,verts,.05); set(gca,'drawmode','fast','position',[0 0 1 1],'ZLim',[4.9 5.1]) set(gcf,'color','black') streamparticles(iverts, 200,... 'Animate',100,'FrameRate',40,... 'MarkerSize',10,'MarkerFaceColor','yellow')