// Grave este arquivo em um dir do disco com o nome pca.sci
// por exemplo :
// d:\bin\scilab2.5\quimiometria

function [t,p,Var]=pca(X,labx,laby);

// Análise de Componentes Principais usando decomposição singular de valores.
// t- matriz de escores dos numpc componetes principais
// p- matriz de loadings dos numpc componetes principais
// X- matriz de dados
// numpc - número de componetes principais
//
// Autor: Marlon Martins dos Reis 
// e-mail: marlon@iqm.unicamp.br
// página:http://lqta.iqm.unicamp.br/grupo/marlon.html 
// Colaboraçao: Márcia M. C. Ferreira
// e-mail: marcia@iqm.unicamp.br
// página: http://www.iqm.unicamp.br/profs/marcia.html 
// Laboratório de Quimiometria Teórica e Aplicada - LQTA -
// 
// http://lqta.iqm.unicamp.br/
// Vers. 3/08/2000
opcaofimpca=0;
while opcaofimpca~=3

if opcaofimpca~=2

[out,in]=argn(0);
[m,n]=size(X);
numpc=min([n m]);

// Pre-tratamento
lab_trat=['Sem Pre-tratamento';'Auto-escalar';'Centar na Media'];
opcaotrat=x_choose(lab_trat,'Escolha o Pre-Tratamento)'); 
if opcaotrat==1
X=X;
else
if opcaotrat==2
X=auto(X);
end;
if opcaotrat==3
X=mncn(X);
end;
end;

// Decomposição em valores singulares

[u,s,v]=svd(X);

// Calcula os numpc componentes principais

t=[];
// escores
t=u(:,1:numpc)*s(1:numpc,1:numpc);
// loadings
p=[];
p=v(:,1:numpc);

var=zeros(numpc,1);
for i=1:numpc
Xpc=zeros(m,n);
Xpc=[t(:,i)*p(:,i)'];
var(i)=(1-[(sum((Xpc(:)-X(:)).^2))/(sum(X(:).^2))])*100;
end;
Var=([[1:numpc]' var cumsum(var)]);


[nv,mv]=size(Var);
for i=1:nv,
tmp=[]; 
for j=1:mv
tmp=[tmp+[' ']+string(Var(i,j))]; 
end; 
labV(i)=tmp;
end;
x_message([[' CP Variância Expl. Var. Acum'];labV]); 


xclear()
numcp(X)

var=zeros(numpc,1);
for i=1:numpc
Xpc=zeros(m,n);
Xpc=[t(:,i)*p(:,i)'];
var(i)=(1-[(sum((Xpc(:)-X(:)).^2))/(sum(X(:).^2))])*100;
end;
Var=([[1:numpc]' var cumsum(var)]);

[nv,mv]=size(Var);
for i=1:nv,
tmp=[]; 
for j=1:mv
tmp=[tmp+[' ']+string(Var(i,j))]; 
end; 
labV(i)=tmp;
end;
// x_message([[' CP Variância Expl. Var. Acum'];labV]); 

[mt,nt]=size(t);
for i=1:nt, labpc(i)=['CP'+string(i)];end;
opcaopc=x_choose(labpc,'Escolha o número de Componentes Principais'); 

t=u(:,1:opcaopc)*s(1:opcaopc,1:opcaopc);
// loadings
p=[];
p=v(:,1:opcaopc);
numpc=opcaopc;

end; //opcaofimpca diferente de Varimax

if opcaofimpca==2
[t,p]=varimax(X,numpc)
end; //opcaofimpca igual de Varimax

// Graficos

cont_win=xget("window");
xset("window",cont_win)
xclear(cont_win+1) 

if in==1
tmp=[]; 
for j=1:n
tmp=[tmp;['Variável-']+string(j)]; 
end; 
laby=tmp
tmp=[]; 
for j=1:m
tmp=[tmp;['Amostra-']+string(j)]; 
end; 
labx=tmp

end;

tmp=[]; 
for j=1:n
tmp=[tmp;string(j)]; 
end; 
laby_aux=tmp
tmp=[]; 
for j=1:m
tmp=[tmp;string(j)]; 
end; 
labx_aux=tmp

tmp=[]; 
for j=1:5
tmp=[tmp;string(j)]; 
end; 
labfont=tmp


opcaografico=0;
while opcaografico~=6
lab_trat=['Gráfico de Escores';'Gráfico de Loadings';'Gráfico Biplot ';'Gráfico de Escores-3D';'Gráfico de Loadings-3D';'FIM'];
opcaografico=x_choose(lab_trat,'Escolha o tipo de Gráfico'); 
if opcaografico==1
titulo=['Gráfico de Escores'];
if opcaofimpca==2,titulo=['Gráfico de Escores-Varimax'];end;
fonte=x_choose(labfont,'Escolha o tamanho da Fonte'); 
opcaonomegraf=x_choose(['Sim';'Nao'],'Deseja inserir nomes no gráfico'); 
if opcaonomegraf==1
escores(t,labx,titulo,fonte)
else
escores(t,labx_aux,titulo,fonte)
end;

end;
if opcaografico==2
titulo=['Loadings'];
if opcaofimpca==2,titulo=['Gráfico de Loadings-Varimax'];end; 
fonte=x_choose(labfont,'Escolha o tamanho da Fonte'); 
opcaonomegraf=x_choose(['Sim';'Nao'],'Deseja inserir nomes no gráfico'); 
if opcaonomegraf==1
loadings(p,laby,titulo,fonte)
else
loadings(p,laby_aux,titulo,fonte)
end;


end;
if opcaografico==3
titulo=['Biplot'];
if opcaofimpca==2,titulo=['Gráfico de Biplot-Varimax'];end;
fonte=x_choose(labfont,'Escolha o tamanho da Fonte'); 
opcaonomegraf=x_choose(['Sim';'Nao'],'Deseja inserir nomes no gráfico'); 
if opcaonomegraf==1
biplot(t,p,labx,laby,titulo,fonte)
else
biplot(t,p,labx_aux,laby,titulo,fonte)
end;


end;
if opcaografico==4
titulo=['Gráfico de Escores'];
if opcaofimpca==2,titulo=['Gráfico de Escores-Varimax'];end;
fonte=x_choose(labfont,'Escolha o tamanho da Fonte'); 
escores3d(t,labx_aux,titulo,fonte)


end;
if opcaografico==5
titulo=['Loadings']; 
if opcaofimpca==2,titulo=['Gráfico de Loadings-Varimax'];end;
fonte=x_choose(labfont,'Escolha o tamanho da Fonte'); 
loadings3d(p,laby_aux,titulo,fonte)



end;
end;


lab_fimpca=['Fazer novo PCA';'Varimax';'FIM'];
opcaofimpca=x_choose(lab_fimpca,'Continuar - PCA -'); 
end; //opcaofimpca
Vf=resume(Var(1:numpc,:));

function [Mcm]=mncn(X);

// Centra a matriz X pela média das colunas
//
//
// Autor: Marlon Martins dos Reis 
// e-mail: marlon@iqm.unicamp.br
// página:http://lqta.iqm.unicamp.br/MARLON.html 
// Colaboraçao: Márcia M. C. Ferreira
// e-mail: marcia@iqm.unicamp.br
// página: http://www.iqm.unicamp.br/profs/marcia.html 
//
// Laboratório de Quimiometria Teórica e Aplicada - LQTA -
// 
// http://lqta.iqm.unicamp.br/


// Dimensões de X

[m,n]=size(X);

// Média das colunas de X

med=[];
for i=1:n
med(1,i)=mean(X(:,i));
end;

// Centrar na média
Med=[];
Med=[ones(m,1)*med];

Mcm=[];
Mcm=X-Med;
Mcm=resume(Mcm);



function [Mae]=auto(X);

// Autoescalar a matriz X centrando na média das colunas e escalando pelo 
// desvio padrão das colunas.
//
// Autor: Marlon Martins dos Reis 
// e-mail: marlon@iqm.unicamp.br
// página:http://lqta.iqm.unicamp.br/MARLON.html 
// Colaboraçao: Márcia M. C. Ferreira
// e-mail: marcia@iqm.unicamp.br
// página: http://www.iqm.unicamp.br/profs/marcia.html 
//
// Laboratório de Quimiometria Teórica e Aplicada - LQTA -
// 
// http://lqta.iqm.unicamp.br/


// Dimensões de X

[m,n]=size(X);

// Média e desvios padrão das colunas de X
Med=[];
Std=[];
for i=1:n
Med(1,i)=mean(X(:,i));
Std(1,i)=st_deviation(X(:,i));
end;
// Centrar na média
Mae=[];
Mae=[X-[ones(m,1)*Med]]./(ones(m,1)*Std);
Mae=resume(Mae);


function numcp(X);

// X- matriz de dados
// numpc - número de componetes principais através de cross validation e PRESS
//
// Autor: Marlon Martins dos Reis 
// e-mail: marlon@iqm.unicamp.br
// página:http://lqta.iqm.unicamp.br/MARLON.html 
// Colaboraçao: Márcia M. C. Ferreira
// e-mail: marcia@iqm.unicamp.br
// página: http://www.iqm.unicamp.br/profs/marcia.html 
//
// Laboratório de Quimiometria Teórica e Aplicada - LQTA -
// 
// http://lqta.iqm.unicamp.br/


[m,n]=size(X);



// Calcula os numpc componentes principais



for i=1:min([n m])-1
for j=1:m
ind=find([1:m]'~=j);
Xtmp=X(ind,:); 
[u,s,v]=svd(Xtmp);
t=u(:,1:i)*s(1:i,1:i);
p=v(:,1:i);
Xpc=t*p';
tmp(j)=sum([Xpc(:)-Xtmp(:)].^2);
end;
Press(i,1)=sum(tmp);
end;

[u,s,v]=svd(X);
t=u(:,1:min([n m]))*s(1:min([n m]),1:min([n m]));
p=v(:,1:min([n m]));
for i=1:min([n m])
Xp=[t(:,i)*p(:,i)']; 
var(i)=(1-[(sum((Xp(:)-X(:)).^2))/(sum(X(:).^2))])*100;
end;


cont_win=xget("window");
xset("window",cont_win+1)
xclear(cont_win+1) 
xset("font",3,2)

mtlb_subplot(3,1,1)
plot2d(Press)
xtitle([' '],['CP'],[' PRESS'])

mtlb_subplot(3,1,2)
plot2d(var)
xtitle([' '],['CP'],[' Variância %'])

mtlb_subplot(3,1,3)
plot2d(cumsum(var))
xtitle([' '],['CP'],[' Variância Acumulada %'])




function escores(t,lab,titulo,fonte)
// Autor: Marlon Martins dos Reis 
// e-mail: marlon@iqm.unicamp.br
// página:http://lqta.iqm.unicamp.br/MARLON.html 
// Colaboraçao: Márcia M. C. Ferreira
// e-mail: marcia@iqm.unicamp.br
// página: http://www.iqm.unicamp.br/profs/marcia.html 
//
// Laboratório de Quimiometria Teórica e Aplicada - LQTA -
// 
// http://lqta.iqm.unicamp.br/


[saida,entrada]=argn(0);
[m,n]=size(t);

if entrada==1
tmp=[]; 
for j=1:m
tmp=[tmp;['Amostra-']+string(j)]; 
end; 
lab=tmp
titulo=['Gráfico de escores']; 
end;

if entrada==2
titulo=['Gráfico de escores'];
fonte=5; 
end;

if entrada==3
fonte=5; 
end;

opcaogr=1;


cont_win=xget("window");
cont_win=cont_win+1;
while opcaogr==1 
for i=1:n, labpc(i)=['CP'+string(i)];end;
opcaopcx=x_choose(labpc,' A Componente Principal para o eixo x'); 
opcaopcy=x_choose(labpc,' A Componente Principal para o eixo y'); 

t1=t(:,opcaopcx);
t2=t(:,opcaopcy);

xclear(cont_win)
xset("window",cont_win)
xset("mark",2,1) 
xset("font",3,fonte)
plot2d1("onn",t1,t2,[-5 -2])

xtitle([titulo],[['CP']+string(opcaopcx)],[['CP']+string(opcaopcy)]) 
for i=1:m, xstring(t1(i),t2(i),lab(i,:));end;

opcaogr=x_choose(['Novo Gráfico';'Fim'],' '); 

cont_win=cont_win+1;
end;



function biplot(t,p,labx,laby,titulo,fonte,seta)
// Gráfico Biplot
//
// t - Matriz de escores
// p - Matriz de loadings
// labx- Designação das amostras
// laby- Designação das variáveis
// titulo - Título do gráfico

// Autor: Marlon Martins dos Reis 
// e-mail: marlon@iqm.unicamp.br
// página:http://lqta.iqm.unicamp.br/MARLON.html 
// Colaboraçao: Márcia M. C. Ferreira
// e-mail: marcia@iqm.unicamp.br
// página: http://www.iqm.unicamp.br/profs/marcia.html 
//
// Laboratório de Quimiometria Teórica e Aplicada - LQTA -
// 
// http://lqta.iqm.unicamp.br/

[saida,entrada]=argn(0);

[m,n]=size(t);
[mp,np]=size(p);

if entrada==2
tmp=[]; 
for j=1:mp
tmp=[tmp;['Variável-']+string(j)]; 
end; 
laby=tmp
tmp=[]; 
for j=1:m
tmp=[tmp;['Amostra-']+string(j)]; 
end; 
labx=tmp;
titulo=['Biplot'];
labcpy=['CP-y'];
labcpx=['CP-x'];
end;

if entrada<6
fonte=5;
seta=.05;

end;
if entrada<7
seta=.05;
end;


opcaogr=1;

cont_win=xget("window");
cont_win=cont_win+1;

while opcaogr==1 

for i=1:n, labpc(i)=['CP'+string(i)];end;
cpx=x_choose(labpc,'( A Componente Principal para o eixo x)'); 
cpy=x_choose(labpc,'( A Componente Principal para o eixo y)'); 

labcpx=['CP'+string(cpx)]; 
labcpy=['CP'+string(cpy)]; 

sx=norm(t(:,cpx));
sy=norm(t(:,cpy));

tbx=[t(:,cpx)./sx].*(sx^.5);
tby=[t(:,cpy)./sy].*(sy^.5);
pbx=[p(:,cpx)].*(sx^.5);
pby=[p(:,cpy)].*(sy^.5);


maxxg=max([tbx;pbx])+[(max([tbx;pbx])).*(.1)*sign(max([tbx;pbx]))];
maxyg=max([tby;pby])+[(max([tby;pby])).*(.1)*sign(max([tby;pby]))];

minxg=min([tbx;pbx])+[(min([tbx;pbx])).*(-.1)*sign(min([tbx;pbx]))];
minyg=min([tby;pby])+[(min([tby;pby])).*(-.1)*sign(min([tby;pby]))];

cont_win=xget("window");
xset("window",cont_win+1)
xset("font",2,fonte)
xset("mark",2,1) 
plot2d(tbx,tby,-3,["011"]," ",[minxg,minyg,maxxg,maxyg])


if labx~=[]
for i=1:m, xstring(tbx(i,1),tby(i,1),labx(i,:));end;
end;

xset("use color",0)
for i=1:mp, xarrows([0 pbx(i)],[0 pby(i)],seta); end;

xset("font",5,fonte) 
if laby~=[]
for i=1:mp, xstring(pbx(i,1),pby(i,1),laby(i,:));end;
end;
xset("font",3,fonte) 
xtitle([ titulo],labcpx,labcpy)
opcaogr=x_choose(['Novo grafico';'Fim'],' '); 
cont_win=cont_win+1;
end;



function loadings(p,lab,titulo,fonte)
// Autor: Marlon Martins dos Reis 
// e-mail: marlon@iqm.unicamp.br
// página:http://lqta.iqm.unicamp.br/MARLON.html 
// Colaboraçao: Márcia M. C. Ferreira
// e-mail: marcia@iqm.unicamp.br
// página: http://www.iqm.unicamp.br/profs/marcia.html 
//
// Laboratório de Quimiometria Teórica e Aplicada - LQTA -
// 
// http://lqta.iqm.unicamp.br/

[saida,entrada]=argn(0);
[m,n]=size(p);

if entrada==1
tmp=[]; 
for j=1:m
tmp=[tmp;['Variável-']+string(j)]; 
end; 
lab=tmp
titulo=['Gráfico de loadings']; 
end;
if entrada==2
titulo=['Gráfico de loadings']; 
fonte=5;

end;

if entrada==3
fonte=5;
end;

opcaogr=1;

cont_win=xget("window");
cont_win=cont_win+1;
while opcaogr==1 

opcaotipo=x_choose(['Loading versus variáveis';'Loadings versus Loadings'],'Escolha o tipo de gráfico'); 


if opcaotipo==1
for i=1:n, labpc(i)=['CP'+string(i)];end;
opcaopcx=x_choose(labpc,'( A Componente Principal para o eixo x)'); 
maxp=max(p(:,opcaopcx));
minp=min(p(:,opcaopcx));
xset("window",cont_win)
xset("mark",2,1) 
xset("font",3,2)

plot2d3("onn",[-1:m+2]',[minp+minp.*.2;0;p(:,opcaopcx);0;maxp+maxp.*.2])
xpoly([-1 m+2],[0 0],"lines")
xaxis(0,[-1 m+2],[0 0 0],[minp+minp.*.2 maxp+maxp.*.2])
xset("window",cont_win)
xset("mark",2,1) 
xset("font",3,2)

xtitle([titulo],['Variáveis'],['Loadings']) 
if lab~=[]
for i=1:m, xstring(i,p(i,opcaopcx),lab(i,:));end;
end;
end;

if opcaotipo==2
for i=1:n, labpc(i)=['CP'+string(i)];end;
opcaopcx=x_choose(labpc,'( A Componente Principal para o eixo x)'); 
opcaopcy=x_choose(labpc,'( A Componente Principal para o eixo y)'); 
p1=p(:,opcaopcx);
p2=p(:,opcaopcy);
xclear()
xset("window",cont_win)
xset("mark",2,5) 
xset("font",5,fonte) 
plot2d1("onn",p1,p2,[-5 -2])
xtitle([titulo],[['Loadings-CP']+string(opcaopcx)],[['LoadingsCP']+string(opcaopcy)]) 
xset("window",cont_win)
for i=1:m, xstring(p1(i),p2(i),lab(i,:));end;

end;
opcaogr=x_choose(['Novo grafico';'Fim'],'selection (click on one item )'); 
cont_win=cont_win+1;
end;



function escores3d(t,lab,titulo,fonte)
// Autor: Marlon Martins dos Reis 
// e-mail: marlon@iqm.unicamp.br
// página:http://lqta.iqm.unicamp.br/MARLON.html 
// Colaboraçao: Márcia M. C. Ferreira
// e-mail: marcia@iqm.unicamp.br
// página: http://www.iqm.unicamp.br/profs/marcia.html 
//
// Laboratório de Quimiometria Teórica e Aplicada - LQTA -
// 
// http://lqta.iqm.unicamp.br/

[saida,entrada]=argn(0);

[m,n]=size(t);

if entrada==1
tmp=[]; 
for j=1:m
tmp=[tmp;string(j)]; 
end; 
lab=tmp
titulo=['Gráfico de escores']; 
end;
if entrada==2
titulo=['Gráfico de escores'];
end;



opcaogr=1;

cont_win=xget("window");
cont_win=cont_win+1;
while opcaogr==1 
for i=1:n, labpc(i)=['CP'+string(i)];end;
opcaopcx=x_choose(labpc,'( A Componente Principal para o eixo x)'); 
opcaopcy=x_choose(labpc,'( A Componente Principal para o eixo y)'); 
opcaopcz=x_choose(labpc,'( A Componente Principal para o eixo z)'); 

t1=t(:,opcaopcx);
t2=t(:,opcaopcy);
t3=t(:,opcaopcz);

xclear()
xset("window",cont_win)
xset("mark",2,1) 
xset("font",3,fonte)

maxxg=max([t1])+[(max([t1])).*(.5)*sign(max([t1]))];
maxyg=max([t2])+[(max([t2])).*(.5)*sign(max([t2]))];
maxzg=max([t3])+[(max([t3])).*(.5)*sign(max([t3]))];

minxg=min([t1])+[(min([t1])).*(-.5)*sign(min([t1]))];
minyg=min([t2])+[(min([t2])).*(-.5)*sign(min([t2]))];
minzg=min([t3])+[(min([t3])).*(-.5)*sign(min([t3]))];

labcaixa=['Sem Caixa';'Parte da Caixa';'Caixa sem Valores';'Caixa com Valores']

opcaobox=x_choose(labcaixa,'( Inserir caixa ao redor do Gráfico)'); 
caixa=opcaobox;

teixx=[minxg:max([t1])/100:max([t1])];
teixy=[minyg:max([t2])/100:max([t2])]; 
teixz=[minzg:max([t3])/100:max([t3])]; 

mteix=max(size(teixx));
mteiy=max(size(teixy));
mteiz=max(size(teixz));


t1g12=[t1' zeros(1,mteix) zeros(1,mteiy) zeros(1,mteiz)];
t2g12=[t2' zeros(1,mteix) zeros(1,mteiy) zeros(1,mteiz)];
t3g12=[t3' zeros(1,mteix) zeros(1,mteiy) zeros(1,mteiz)];


t1g13=[teixx zeros(t1') zeros(1,mteiy) zeros(1,mteiz)];
t2g13=[zeros(1,mteix) teixy zeros(t2') zeros(1,mteiz)];
t3g13=[zeros(1,mteix) zeros(1,mteiy) zeros(t3') teixz];

xset("font",3,1)

x_t=[t1g12' t1g13' zeros(t2g13') zeros(t2g13')];
y_t=[t2g12' zeros(t2g13') t2g13' zeros(t2g13')];
z_t=[t3g12' zeros(t2g13') zeros(t2g13') t3g13' ];

param3d1(x_t,y_t,list(z_t,[-1 2 3 5]),[30],[30],[['CP']+string(opcaopcx)+['@CP']+string(opcaopcy)+['@CP']+string(opcaopcz)],[1,1],[minxg,maxxg,minyg,maxyg,minzg,maxzg])


opcaogir=0;
opcaogir=x_choose(['Fim'],' ');

if opcaogir==1
opcaoang=1;
while opcaoang==1

alfa=x_dialog(['Entre com o valor de alpha, mostrado na janela do Gráfico '],'0')
theta=x_dialog(['Entre com o valor de theta, mostrado na janela do Gráfico '],'0')

cont_win=cont_win+1;
xset("window",cont_win)
xset("font",3,fonte) 
param3d1(x_t,y_t,list(z_t,[-1 2 3 5]),[sscanf(theta,'%f')],[sscanf(alfa,'%f')],[['CP']+string(opcaopcx)+['@CP']+string(opcaopcy)+['@CP']+string(opcaopcz)],[1,1],[minxg,maxxg,minyg,maxyg,minzg,maxzg])

xset("font",3,fonte) 
[x,y]=geom3d(t1,t2,t3);
for i=1:m
xstring(x(i),y(i),lab(i))
end;
xtitle([titulo+[' CP']+string(opcaopcx)+['xCP']+string(opcaopcy)+['xCP']+string(opcaopcz)])
xset("font",3,1) 
[x1,y1]=geom3d(min(t1),0,0);
xstring(x1(1).*(1.5),y1(1).*(1.5),[['cp']+string(opcaopcx)])

[x2,y2]=geom3d(0,min(t2),0);
xstring(x2(1).*(1.5),y2(1).*(1.5),[['cp']+string(opcaopcy)])

[x3,y3]=geom3d(0,0,min(t3));
xstring(x3(1).*(1.5),y3(1).*(1.5),[['cp']+string(opcaopcz)])

opcaoang=x_choose(['Novo Ângulo';'Fim'],'Continuar?'); 

end;

end;

opcaogr=x_choose(['Novo Gráfico';'Fim'],'Continuar?'); 

cont_win=cont_win+1;
end;



function loadings3d(t,lab,titulo,fonte)
// Autor: Marlon Martins dos Reis 
// e-mail: marlon@iqm.unicamp.br
// página:http://lqta.iqm.unicamp.br/MARLON.html 
// Colaboraçao: Márcia M. C. Ferreira
// e-mail: marcia@iqm.unicamp.br
// página: http://www.iqm.unicamp.br/profs/marcia.html 
//
// Laboratório de Quimiometria Teórica e Aplicada - LQTA -
// 
// http://lqta.iqm.unicamp.br/

[saida,entrada]=argn(0);

[m,n]=size(p);

if entrada==1
tmp=[]; 
for j=1:m
tmp=[tmp;['Variável-']+string(j)]; 
end; 
lab=tmp
titulo=['Gráfico de loadings']; 
end;
if entrada==2
titulo=['Gráfico de loadings'];
end;



opcaogr=1;

cont_win=xget("window");
cont_win=cont_win+1;
while opcaogr==1 
for i=1:n, labpc(i)=['CP'+string(i)];end;
opcaopcx=x_choose(labpc,'( A Componente Principal para o eixo x)'); 
opcaopcy=x_choose(labpc,'( A Componente Principal para o eixo y)'); 
opcaopcz=x_choose(labpc,'( A Componente Principal para o eixo z)'); 

t1=t(:,opcaopcx);
t2=t(:,opcaopcy);
t3=t(:,opcaopcz);

xclear()
xset("window",cont_win)
xset("mark",2,1) 
xset("font",3,fonte)

maxxg=max([t1])+[(max([t1])).*(.5)*sign(max([t1]))];
maxyg=max([t2])+[(max([t2])).*(.5)*sign(max([t2]))];
maxzg=max([t3])+[(max([t3])).*(.5)*sign(max([t3]))];

minxg=min([t1])+[(min([t1])).*(-.5)*sign(min([t1]))];
minyg=min([t2])+[(min([t2])).*(-.5)*sign(min([t2]))];
minzg=min([t3])+[(min([t3])).*(-.5)*sign(min([t3]))];

labcaixa=['Sem Caixa';'Parte da Caixa';'Caixa sem Valores';'Caixa com Valores']

opcaobox=x_choose(labcaixa,'( Inserir caixa ao redor do Gráfico)'); 
caixa=opcaobox;



teixx=[minxg:max([t1])/100:max([t1])];
teixy=[minyg:max([t2])/100:max([t2])]; 
teixz=[minzg:max([t3])/100:max([t3])]; 

mteix=max(size(teixx));
mteiy=max(size(teixy));
mteiz=max(size(teixz));


t1g12=[t1' zeros(1,mteix) zeros(1,mteiy) zeros(1,mteiz)];
t2g12=[t2' zeros(1,mteix) zeros(1,mteiy) zeros(1,mteiz)];
t3g12=[t3' zeros(1,mteix) zeros(1,mteiy) zeros(1,mteiz)];


t1g13=[teixx zeros(t1') zeros(1,mteiy) zeros(1,mteiz)];
t2g13=[zeros(1,mteix) teixy zeros(t2') zeros(1,mteiz)];
t3g13=[zeros(1,mteix) zeros(1,mteiy) zeros(t3') teixz];

xset("font",3,1)

x_t=[t1g12' t1g13' zeros(t2g13') zeros(t2g13')];
y_t=[t2g12' zeros(t2g13') t2g13' zeros(t2g13')];
z_t=[t3g12' zeros(t2g13') zeros(t2g13') t3g13' ];

param3d1(x_t,y_t,list(z_t,[-1 2 3 5]),[30],[30],[['CP']+string(opcaopcx)+['@CP']+string(opcaopcy)+['@CP']+string(opcaopcz)],[1,1],[minxg,maxxg,minyg,maxyg,minzg,maxzg])


opcaogir=0;
opcaogir=x_choose(['Fim'],' ');

if opcaogir==1
opcaoang=1;
while opcaoang==1

alfa=x_dialog(['Entre com o valor de alpha, mostrado na janela do Gráfico '],'0')
theta=x_dialog(['Entre com o valor de theta, mostrado na janela do Gráfico '],'0')

cont_win=cont_win+1;
xset("window",cont_win)
xset("font",3,fonte) 
param3d1(x_t,y_t,list(z_t,[-1 2 3 5]),[sscanf(theta,'%f')],[sscanf(alfa,'%f')],[['CP']+string(opcaopcx)+['@CP']+string(opcaopcy)+['@CP']+string(opcaopcz)],[1,1],[minxg,maxxg,minyg,maxyg,minzg,maxzg])

xset("font",3,fonte) 
[x,y]=geom3d(t1,t2,t3);
for i=1:m
xstring(x(i),y(i),lab(i))
end;
xtitle([titulo+[' CP']+string(opcaopcx)+['xCP']+string(opcaopcy)+['xCP']+string(opcaopcz)])
xset("font",3,1) 
[x1,y1]=geom3d(min(t1),0,0);
xstring(x1(1).*(1.5),y1(1).*(1.5),[['cp']+string(opcaopcx)])

[x2,y2]=geom3d(0,min(t2),0);
xstring(x2(1).*(1.5),y2(1).*(1.5),[['cp']+string(opcaopcy)])

[x3,y3]=geom3d(0,0,min(t3));
xstring(x3(1).*(1.5),y3(1).*(1.5),[['cp']+string(opcaopcz)])

opcaoang=x_choose(['Novo Ângulo';'Fim'],'Continuar?'); 

end;

end;

opcaogr=x_choose(['Novo Gráfico';'Fim'],'Continuar?'); 

cont_win=cont_win+1;

end;

function [tv,pv]=varimax(X,numpc);
// Autor: Marlon Martins dos Reis 
// e-mail: marlon@iqm.unicamp.br
// página:http://lqta.iqm.unicamp.br/MARLON.html 
// Colaboraçao: Márcia M. C. Ferreira
// e-mail: marcia@iqm.unicamp.br
// página: http://www.iqm.unicamp.br/profs/marcia.html 
//
// Laboratório de Quimiometria Teórica e Aplicada - LQTA -
// 
// http://lqta.iqm.unicamp.br/

lbd=1;
[n,m]=size(X);
lbd=1/n;
[uvar,svar,vvar]=svd(X);
F=vvar(:,1:numpc); 
[m_F,n_f]=size(F);
zold=sum([sum(F.^4)]-[lbd.*(sum(F.^2).^2)]);
z=0;
cont_z=1;
while abs(zold-z)>1e-10 
for i=1:n_f-1
for j=i+1:n_f

x=F(:,i);
y=F(:,j);

u=(x.*x)-(y.*y);
v=2.*(x.*y);

u_c=mncn(u);
v_c=mncn(v);

a=2*n*(u_c'*v_c);
b=n*(u_c'*u_c)-n*(v_c'*v_c);
c=(a^2+b^2)^(1/2);

v=-sign(a)*[(b+c)/(2*c)]^(1/2);

seno_teta=(.5-.5*v)^(1/2);
coseno_teta=(.5+.5*v)^(1/2);

if v>=0
T=[
coseno_teta seno_teta
-seno_teta coseno_teta];

else
T=[
seno_teta coseno_teta
coseno_teta -seno_teta];
end;

p=[x,y]*T; 
F(:,i)=p(:,1);
F(:,j)=p(:,2);

end;
end;
zold=z;
z=sum([sum(F.^4)]-[lbd.*(sum(F.^2).^2)]);

z_temp(cont_z,1)=z;
cont_z=cont_z+1;
end;

tv=X*F;
pv=F;
tv=resume(tv);
pv=resume(pv);