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
b
modrá
.
Bod
g
zelená
o
r
červená
x
Symbol Styl čáry -
plná
kruh
:
tečkovaná
kříž
-.
čerchovaná
--
čárkovaná
c
modrozelená
+
plus
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
zobrazuje sloupce matice m x n jako m skupin do n svislých sloupců totéž horizontálně totéž 3D totéž horizontálně 3D plocha
barh bar3 bar3h area Příklady Jeden sloupec dat x = -2.9:0.2:2.9; bar(x,exp(-x.*x),'r')
více sloupců Y = [ 1 2 3; 5 7 8; 4 9 7;5 7 4]; bar(Y)
3D horizontálně Y = [ 1 2 3; 5 7 8; 4 9 7;5 7 4]; 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 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)
diskrétní sekvence diskrétní sekvence z dat z roviny xz
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 osy poměr stran titulky
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') axis([5 15 5 15 -8 8]) set(gca,'ZTickLabel','Negative||Positive') set(gca,'PlotBoxAspectRatio',[2.5 2.5 1]) 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 load wind; % 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') box on 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]); box on
ta stejná data pomocí izoploch figure slice(value,[1:2:10],[1],[1]); campos([10,8,10]); box on
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]); box on
vektorová data – kuželový graf load wind 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 load wind [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ů load wind [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 load wind [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') box on streamparticles(iverts,35,'animate',10,'ParticleAlignment','on')
totéž v řezu (z = 5) load wind 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')