Introdução ao MATLAB Parte 3 6 Gráficos 2D Há diversos comandos para produzir gráficos em 2D (veja a Figura 1). O mais utilizado deles é o comando plot. Ele admite argumentos de entrada, que permitem adicionar uma série de opções à saída gráfica, como título, identificação dos eixos, tamanho das fontes, cores, etc. É possível superpor gráficos ou obter vários deles em uma mesma janela. Estas opções serão ilustradas com diversos exemplos nos próximos parágrafos. Figura 1 – Comandos para gerar gráficos 2D Comandos plot, hold e grid (Figura 2) % Script 6.1 x = 0:0.02*pi:2*pi; y = sin(x); z = cos(x); % gera o gráfico do seno de x em preto plot(x,y,'black'); % o próximo comando retém a janela gráfica e suas propriedades % para comandos gráficos adicionais hold on; % gera o gráfico do cosseno de x em vermelho plot(x,z,'red'); % libera a janela gráfica hold off % acrescenta um grid ao gráfico grid 1 0.8 0.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1 0 1 2 3 4 5 6 Figura 2 – Comandos plot, hold e grid Opções do comando plot (Figura 3) – veja detalhes usando o comando help. % Script 6.2 x = linspace(0,2*pi,30); % 30 divisões do intervalo [0,2*pi) y = sin(x); z = cos(x); plot(x,y,'b:p',x,z,'c-',x,z,'m+'); 7 1 0.8 0.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1 0 1 2 3 4 5 6 7 Figura 3 – Opções do comando plot Quando as funções tan(x) e cot(x) são adicionadas, o eixo das ordenadas “explode”; como resultado, informação é perdida e o gráfico não exibe mais o comportamento das funções trigonométricas (veja o resultado na Figura 4). % Script 6.3 x = linspace(0,2*pi,30); y = sin(x); z = cos(x); t = tan(x); % tangente de x ct = cot(x); % cotangente de x plot(x,y,'r*',x,z,'mx',x,t,'bo-',x,ct,'kp-'); Para evitar isso, os valores mínimo e máximo dos eixos coordenados devem ser ajustados por meio do comando axis([xmin xmax ymin ymax]). A Figura 5 resulta da execução de >> axis([0 2*pi -3 3]); 15 0.5 x 10 0 -0.5 -1 -1.5 -2 -2.5 -3 -3.5 -4 -4.5 0 1 2 3 4 5 6 7 Figura 4 – Curvas de sin(x), cos(x), tan(x) e cot(x) 3 2 1 0 -1 -2 -3 0 1 2 3 4 Figura 5 – Ilustração do comando axis na figura anterior 5 6 A inclusão de título, a identificação dos eixos, a inserção de legenda e de um texto realizadas pelos comandos title, xlabel, ylabell, legend e text abaixo são vistos na Figura 6). % Script 6.4 x = linspace(0,2*pi,30); y = sin(x); z = cos(x); t = tan(x); % tangente de x ct = cot(x); % cotangente de x plot(x,y,'r*',x,z,'mx',x,t,'bo-',x,ct,'kp-'); axis([0 2*pi -3 3]);title('Funções Trigonométricas','FontSize',14,'Fontweight','Bold'); xlabel('Ângulo \theta [rad]','FontSize',14,'Fontweight','Bold',... 'FontAngle','normal'); ylabel('Funções','FontSize',14,'Fontweight','Bold','FontAngle',... 'italic'); legend('sin(\theta)','cos(\theta)','tan(\theta)','cot(\theta)'); text(0.5,-1.5,'\rightarrow Texto'); Funções Trigonométricas 3 sin() cos() tan() 2 cot() Funções 1 0 -1 Texto -2 -3 0 1 2 3 4 5 6 Ângulo [rad] Figura 6 – Comandos title, xlabel, ylabel, legend e text A saída para \theta é a letra grega (segue a notação do LaTeX, por exemplo: \alpha, \delta, \nabla). As características das fontes podem ser especificadas, tais como o tamanho em pontos (14, no caso), se negrito, normal ou itálico, etc. O comando text serve para introduzir um texto qualquer em um ponto específico (x,y) da área gráfica. Comando subplot Através deste comando, pode-se exibir um arranjo de gráficos em uma mesma janela gráfica, como ilustra a Figura 7. sin(x) cos(x) 1 1 0.5 0.5 0 0 -0.5 -0.5 -1 0 2 4 6 -1 0 2sin(x)cos(x) 20 0.5 10 0 0 -0.5 -10 0 2 4 4 6 2sin(x)/cos(x) 1 -1 2 6 -20 0 2 4 6 Figura 7 – Arranjo gráfico obtido usando o comando subplot Obtenha este gráfico, realizando cada uma das etapas do script abaixo e observando o resultado. % x y z u v Script 6.5 = linspace(0,2*pi,30); = sin(x); = cos(x); = 2*sin(x).*cos(x); = sin(x)./(cos(x)+eps); % reserva uma janela para 4 gráficos (2x2) e ativa % a posição superior esquerda (1) subplot(2,2,1); plot(x,y); % exibe y(x) axis([0 2*pi -1 1]); % ajusta os eixos x e y title('sin(x)'); % titulo do gráfico ativo % ativa a posição superior direita (2) subplot(2,2,2); plot(x,z); % exibe z(x) axis([0 2*pi -1 1]); % ajusta os eixos x e z title('cos(x)'); % titulo do gráfico ativo % ativa a posição inferior esquerda (3) subplot(2,2,3); plot(x,u); % exibe u(x) axis([0 2*pi -1 1]); % ajusta os eixos x e u title('2sin(x)cos(x)'); % titulo do gráfico ativo % ativa a posição inferior direita (4) subplot(2,2,4); plot(x,v); % exibe v(x) axis([0 2*pi -20 20]); % ajusta os eixos x e v title('2sin(x)/cos(x)'); % titulo do gráfico ativo Comandos loglog, semilogx e semilogy Estes comandos devem ser usados quando escalas logarítmicas forem requeridas. Faça um script que gere a Figura 7. Escala decimal em X e em Y Escala log em X 1.5 1.5 1 - sin(x) 2 1 - sin(x) 2 1 0.5 0 1 0.5 0 2 4 0 6 Escala log em Y Escala log em X e log em Y 0 0 10 10 1 - sin(x) 1 - sin(x) 0 10 -2 10 -2 10 0 2 4 6 0 10 Figura 8 - Comandos loglog, semilogx e semilooy Outros tipos de gráficos O gráfico no formato de pizza ou torta, ilustrado na Figura 9, é obtido por meio do comando pie(arg1,arg2). No script abaixo, o primeiro argumento contém os valores a serem plotados e o segundo destaca a fatia de maior percentual. Obtenha o conteúdo do segundo argumento. a = [0.5 1 1.5 2.0 1 0.3]; % valores a serem plotados pie(a,a==max(a)); title('Produção de grãos'); legend('Arroz','Feijão','Soja','Trigo','Milho','Cevada'); Produção de grãos 5% 8% Arroz Feijão Soja Trigo Milho Cevada 16% 16% 24% 32% Figura 9 - Gráfico em formato de pizza A versão tridimensional deste gráfico (Figura 10) é obtida através de: destaque = [0 1 0 1 0 1]; pie3(a,destaque); colormap hsv; % pedaços em destaque % formato pizza tridimensional % opção de tonalidade de cor 16% 5% 8% 32% 16% 24% Figura 10 – Versão 3D do gráfico pizza Gráficos de barras verticais são produzidos pelo comando bar(arg1, arg2), onde arg2 são as abscissas e arg1 são as ordenadas correspondentes. Para este caso, a escala dos valores das abcissas não é adequada para um gráfico de barras verticais (veja a Figura 11), pois os primeiros valores variam de 10 em 10 anos, enquanto nos dois últimos, a diferença é de apenas um ano. a = [0.5 1 1.5 2.0 1 0.3]; % produção de grãos b = [1960 1970 1980 1990 2000 2001]; % anos correspondentes bar(b,a); % gráfico de barras verticais 2 1.8 1.6 1.4 1.2 1 0.8 0.6 0.4 0.2 0 1960 1970 1980 1990 2000 2001 Figura 11 - Gráfico de barras verticais Uma forma mais adequada seria utilizar um gráfico de barras horizontais como o da Figura 12. Para isso, entre com os comandos abaixo. a = [0.5 1 1.5 2.0 1 0.3]; % produção de grãos b = [1960 1970 1980 1990 2000 2001]; % anos correspondentes barh(b,a); % gráfico de barras horizontais xlabel('Anos de produção'); ylabel('Produção de grãos (em milhões de toneladas)'); Produção de grãos (em milhões de toneladas) 2001 2000 1990 1980 1970 1960 0 0.2 0.4 0.6 0.8 1 1.2 Anos de produção 1.4 1.6 1.8 2 Figura 12 - Gráfico de barras horizontais No comando stairs abaixo, são usados os vetores a e b definidos anteriormente. O gráfico em escada obtido é mostrado na Figura 13. stairs(b,a); xlabel(' Anos de produção '); ylabel(' Produção em milhôes de toneladas '); 2 Produção em milhôes de toneladas 1.8 1.6 1.4 1.2 1 0.8 0.6 0.4 0.2 1960 1965 1970 1975 1980 1985 1990 Anos de produção Figura 13 - Gráfico em escada 1995 2000 2005 O próximo script produz o gráfico de área compreendida entre a curva e o eixo X (Figura 14). x = 0:0.05*pi:3*pi; y = x.^3.*sin(x)+x/10; xlabel(' Abcissa X '); ylabel(' Ordenada = x.^3 * sin(x) + x/10 '); area(x,y); 600 500 400 300 200 100 0 -100 -200 0 1 2 3 4 5 6 7 8 9 Figura 14 - Gráfico de área Como último exemplo de gráficos em 2D, o script abaixo ilustra a obtenção de gráficos polares (Figura 15). Os pontos das curvas não são mais descritos por pares ordenados (x,y) em coordenadas cartesianas, mas por pares (r,) em coordenadas polares. % Script 6.6 theta = 0:2*pi/100:2*pi; r = theta/(2*pi); subplot(1,2,1); polar(theta,r); % gráfico em coordenadas polares title('* E S P I R A L *'); subplot(1,2,2); polar(theta,sin(2*theta).*cos(2*theta)); title('Rosa de 8 pétalas'); Rosa de 8 pétalas *ESPIRAL* 90 90 1 120 60 0.5 150 30 180 330 240 300 60 0.25 150 0 210 0.5 120 30 180 0 210 330 240 270 300 270 Figura 15 – Gráficos em coordenadas polares 7 Gráficos 3D Há também uma grande variedade de comandos para gerar gráficos tridimensionais (veja a Figura 16). Figura 16 - Comandos para gerar gráficos 3D Gráficos de linha Para traçar gráficos curvilíneos 3D, utiliza-se o comando ou função plot3. No próximo exemplo, uma curva 3D em forma de hélice é gerada (Figura 17), cujos pontos são definidos pela terna ordenada (sen(t), cos(t), t). % Script 7.1 t = linspace(0,10*pi,200); plot3(sin(t),cos(t),t); xlabel('x = sen(t)'); ylabel('y = cos(t)'); zlabel('z = t'); grid on 40 z=t 30 20 10 0 1 0.5 1 0.5 0 0 -0.5 y = cos(t) -0.5 -1 -1 x = sin(t) Figura 17 – Hélice: curva paramétrica Gráficos de superfície O script abaixo gera a Figura 18. Estude-o e verifique o efeito de cada comando. % Script 7.2 x = -7.5:0.5:7.5; % vetor ou lista x y = -7.5:0.5:7.5; % vetor ou lista y [X,Y] = meshgrid(x,y); % gera uma malha de pontos R = sqrt(X.^2+Y.^2)+eps; % soma-se eps para evitar divisão por zero Z = sin(R)./R+1; % cálculo da coordenada Z mesh(X,Y,Z); % gráfico em malha hold on; % segura as saídas gráficas posteriores na janela atual pcolor(X,Y,Z); % provoca a aparição de uma malha colorida no domínio shading interp; % a cor é definida de acordo com a altura contour(X,Y,Z,20,'k'); % 20 curvas de nível em preto, % escolhidas automaticamente colorbar; % apresenta uma escala colorida de valores hold off; % libera a janela gráfica 1.9 1.8 2 1.7 1.6 1.5 1.5 1 1.4 1.3 0.5 1.2 0 10 1.1 5 10 1 5 0 0 -5 0.9 -5 -10 -10 Figura 18 – Gráfico de superfície Animação gráfica O primeiro exemplo (script 7.3) mostra uma animação bidimensional. Inicialmente, constrói-se uma sequência de 20 gráficos, que é armazenada em uma matriz M; em seguida, o comando movie exibe 5 vezes a sequência armazenada em M a uma taxa de repetição 10 quadros por segundo. Estude o script e verifique o efeito de cada comando. % Script 7.3 x = -pi/2:.1:pi/2; for c=1:20, y = sin(2*x+c*pi/10); plot(x,y,'LineWidth',18); axis([-pi/2 pi/2 -1 1]); M(c) = getframe; end; movie(M,5,10);