O Scilab é um software que tem uma ampla variedade de recursos para plotar gráficos. Os plots básicos, normalmente envolvem uma variável independente $x$ uma variável dependente $y$ e são bidimensionais. Estes casos mais simples já foram abordados no seguinte post:
Entretanto, como fazer nos casos onde há duas ou mais variáveis independentes? Há várias opções no Scilab e é recomendado que o leitor dê uma procurada no help do Scilab pelo seguinte termo: “3d_plot” . Vai aparecer da ordem de uns 20 comandos diferentes para plotar gráficos 3d. Entretanto, podemos sumarizar estas opções todas em três tipos básicos: plots linhas, plots de “nuves” e de superfície em 3d.
Nos plots de “linha” no espaço tridimensional, a função a ser descrita é algo como $f(t)=g(x(t),y(t),z(t))$. Ou seja, $f:\mathbb{R}^1 \rightarrow \mathbb{R}^3$. E os seus pontos são conectados ao longo da variação em $t$, formando uma “linha”. Os plots de “nuves”, não são necessariamente funções. É apenas uma forma de visualização de uma distribuição de pontos isolados em um espaço tridimensional. E os plots de superfícies descrevem uma “casca” bidimensional em um espaço tridimensional. Ou seja, é uma função do tipo: $f:\mathbb{R}^2 \rightarrow \mathbb{R}^3$. É possível também realizar um plot de um campo vetorial em 3d. Ou seja, uma função $f:\mathbb{R}^3 \rightarrow \mathbb{R}^3$. Entretanto, este último caso vai ficar para um outro momento.
Plots de $f:\mathbb{R}^1 \rightarrow \mathbb{R}^3$
Neste caso, precisamos de uma função definida parametricamente em relação a uma variável $t$. Para ilustrar, vamos utilizar a seguinte função $f(t)$:
\[ f(t) = \begin{bmatrix}
e^{ \frac{-3t}{7 \pi} } sen(t) \\
e^{ \frac{-3t}{7 \pi} } cos(t) \\
\frac{t}{20}
\end{bmatrix} \]
Vamos plotar a função $f(t)$ para $0 \leq t \leq 7 \pi$ com intervalos de amostragem de $0.1$. No Scilab a função que realiza a plotagem paramétrica é: param3d. Ela tem muitas opções de uso e vale dar uma olhada no manual do Scilab para conhecer todas as opções. Entretanto, no mínimo, você deve passar três parâmetros que correspondem a sequência dos pontos nas coordenadas $x$, $y$ e $z$. Abaixo, segue um código ilustrativo utilizando a função param3d para realizar o plot da função $f(t)$ definida acima.
//definindo uma função 3d paramétrica em t
t = 0:0.1:7*%pi;
r = exp(-3*t/max(t));
//Equação paramétrica da curva em 3d
x = r.*sin(t)
y = r.*cos(t)
z = t/20
title("www.drgomes.pro", "fontsize", 4) //Titulo do plot
param3d(x, y, z, 30, 72,"X@Y@Z",[4,4])
//Perfumaria para deixar o plot mais bonito...
xgrid(2, 1, 7) //Grade
curve = gce();
curve.mark_mode = "on"; //Marcador
curve.mark_style = 9; //Tipo do marcado 9 -> bolinha
curve.mark_size = 0.5 //Tamanho do marcador
curve.mark_foreground = color("red"); //Cor do marcador
O script acima produz a seguinte imagem:
Como dito anteriormente, param3d tem um monte de opções. Abaixo, por exemplo, tem uma “releitura” do script anterior sem as bolinhas vermelhas, com uma linha mais grossa e com cor “marrom arenoso”.
//Exemplo 2
//definindo uma função 3d paramétrica em t
t = 0:0.1:7*%pi;
r = exp(-3*t/max(t));
//Equação paramétrica da curva em 3d
x = r.*sin(t)
y = r.*cos(t)
z = t/20
title("www.drgomes.pro", "fontsize", 4) //Titulo do plot
param3d(x, y, z, 30, 72,"X@Y@Z",[4,4])
//Perfumaria para deixar o plot mais bonito...
xgrid(2, 1, 7) //Grade
curve = gce();
curve.thickness = 3; //Espessura da linha
//Ver a cor em help color_list
//ou usar color(R,G,B)
curve.foreground = color("sandybrown");
O script acima produz a seguinte imagem:
Plots de uma nuvem de pontos em 3d
Os plots de “nuves” normalmente são utilizados para visualizar grandes quantidades de dados em 3d. É uma forma de visualização de uma distribuição de pontos isolados em um espaço tridimensional. No Scilab, a função utilizada para plotar esse tipo de gráfico é a: scatter3d . Abaixo segue um exemplo de um script utilizando o comando scatter3d para uma nuvem de 1000 pontos de uma distribuição normal tridimensional.
//Exemplo 3
rand('normal') //Números aleatórios com distribuição normal
//Núvem de pontos com 1000 amostras
N=1000
x=rand(1,N)
y=0.5*rand(1,N)
z=0.5*rand(1,N)
title("www.drgomes.pro", "fontsize", 4) //Titulo do plot
scatter3d(x, y, z, 10);
//Perfumaria para deixar o plot mais bonito...
f=gcf() //Captura o contexto gráfico
a = f.children();
a.data_bounds = [-3 3 -3 3 -3 3]; //Limites da plotagem
a.rotation_angles = [50 -50]; //Posicionamento [alpha, theta]
isoview on; //Mesma escala em todos os eixos
O resultado da execução do script acima é o gráfico de nuvem abaixo. Cada uma das amostras é representada neste gráfico como uma pequena bolinha azul. O simbolo e cor utilizados para representar as amostras podem ser modificados facilmente. É possível, também, gerar visualizações na nuvem em posições diferentes, mudando os ângulos de rotação (ver linha 17 do script).
Nada impede que a função scatter3d também seja utilizada para plotar valores de uma função em $\mathbb{R}^1$ ou $\mathbb{R}^2$. Entretanto, nestes casos os pontos consecutivos não serão “ligados” por uma linha ou superfície.
Plots de $f:\mathbb{R}^2 \rightarrow \mathbb{R}^3$
No caso de plot de superfícies bidimensionais em um espaço tridimensional, o comando mais comum no Scilab é o plot3d. Ou seja, esse é um comando para plotar funções do tipo $f:\mathbb{R}^2 \rightarrow \mathbb{R}^3$. Este comando aceita no mínimo 3 parâmetros diferentes. Os dois primeiro, normalmente são vetores com as variações de entrada da função, ex $x$ e $y$ . O terceiro parâmetro é uma matriz que contem a saída $z$ da função para cada $x$ e $y$ de entrada. Ou seja, das três dimensões, $x$ e $y$ são as variáveis independentes e $z$ é a variável dependente ($z=f(x,y)$).
Para ilustrar a utilização desse comando, imagine que temos uma função tipo gaussiana, como descrito abaixo:
\[ f(x,y)= e^{-x^2-y^2} \]
E que vamos avaliar essa função em um intervalo de -4 a 4 com passos de 0.25 em $x$ e $y$. O script para fazer o plot desta função é o descrito a seguir:
//Exemplo 4
// plote simples de z=f(x,y)
t=[-4:0.25:4]';
N=size(t,'*')
//Definição da função z=f(x,y)
function z=f(x,y)
z=exp(-(x^2+y^2))
endfunction
//Criação da matriz z
//z armazena todos os valores possíveis de x e y em f(x,y)
z=zeros(N,N)
for i=1:N,
for j=1:N,
z(i,j)=f(t(i),t(j));
end
end
//Plotagem
title("www.drgomes.pro", "fontsize", 4) //Titulo do plot
plot3d(t,t,z)
//Perfumaria para deixar o plot mais bonito...
f=gcf() //Captura o contexto gráfico
a = f.children();
a.data_bounds = [-3 3 -3 3 0 1]; //Limites da plotagem
a.rotation_angles = [80 -50]; //Posicionamento [alpha, theta]
xgrid(5, 1, 7)
Abaixo segue o respectivo plot gerado pelo comando plot3d no script acima.
E quando temos mais de 3 variáveis independentes?
Para realizar plots em 2d e 3d temos um monte de comandos e opções diferentes no Scilab. Se considerarmos o “tempo” como um “quarto eixo” até dá para fazer umas animações e considerar como “um plot em 4d”. Entretanto, a interpretação fica mais difícil. Se desejarmos plotar alguma coisa que está em um espaço de dimensão maior que 4, a coisa já desanda completamente… Se não for utilizado PCA! Sim, podem utilizar análise de componentes principais para gerar visualizações, ainda que parciais, de dados em espaços de grande dimensionalidade. Vou postar um exemplo em breve de como utilizar análise PCA para gerar visualizações de dados em dimensões maiores que 3. Enquanto não envio o post, vocês já podem ir lendo sobre a ideia básica da análise PCA no seguinte post:
That’s all folks!
Deixe um comentário