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
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+');
0 1 2 3 4 5 6 7
-1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1
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]);
0 1 2 3 4 5 6 7
-1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1
Figura 4 – Curvas de sin(x), cos(x), tan(x) e cot(x)
Figura 5 – Ilustração do comando axis na figura anterior
0 1 2 3 4 5 6 7
-4.5 -4 -3.5 -3 -2.5 -2 -1.5 -1 -0.5 0 0.5x 1015
0 1 2 3 4 5 6
-3 -2 -1 0 1 2 3
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');
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.
0 1 2 3 4 5 6
-3 -2 -1 0 1 2 3
Funções Trigonométricas
Ângulo [rad]
Funções
Texto
Texto
Texto
sin() cos() tan() cot()
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 .
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.
% Script 6.5
x = linspace(0,2*pi,30);
y = sin(x);
z = cos(x);
u = 2*sin(x).*cos(x);
v = 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
0 2 4 6
-1 -0.5 0 0.5 1
sin(x)
0 2 4 6
-1 -0.5 0 0.5 1
cos(x)
0 2 4 6
-1 -0.5 0 0.5 1
2sin(x)cos(x)
0 2 4 6
-20 -10 0 10 20
2sin(x)/cos(x)
% 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 .
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
0 2 4 6
0 0.5 1 1.5 2
1 - sin(x)
Escala decimal em X e em Y
100 0
0.5 1 1.5 2
1 - sin(x)
Escala log em X
0 2 4 6
10-2 100
1 - sin(x)
Escala log em Y
100 10-2
100
1 - sin(x)
Escala log em X e log em Y
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');
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]; % pedaços em destaque
pie3(a,destaque); % formato pizza tridimensional colormap hsv; % opção de tonalidade de cor
Figura 10 – Versão 3D do gráfico pizza 8%
16%
24%
32%
16%
5%
Produção de grãos
Arroz Feijão Soja Trigo Milho Cevada
32%
16%
24%
5%
8%
16%
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
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)');
1960 1970 1980 1990 20002001
0 0.2 0.4 0.6 0.8 1 1.2 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 ');
Figura 13 - Gráfico em escada
0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2
1960 1970 1980 1990 20002001
Anos de produção
Produção de grãos (em milhões de toneladas)
1960 1965 1970 1975 1980 1985 1990 1995 2000 2005 0.2
0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2
Anos de produção
Produção em milhôes de toneladas
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);
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');
0 1 2 3 4 5 6 7 8 9
-200 -100 0 100 200 300 400 500 600
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 0.5
1
30
210
60
240
90
270 120
300 150
330
180 0
* E S P I R A L *
0.25 0.5
30
210
60
240
90
270 120
300 150
330
180 0
Rosa de 8 pétalas
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
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
-1
-0.5
0
0.5
1
-1 -0.5
0 0.5
1 0 10 20 30 40
x = sin(t) y = cos(t)
z = t
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
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);
-10
-5
0
5
10
-10 -5 0 5 10
0 0.5 1 1.5 2
0.9 1 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9