{{:bie5782:01_curso_atual:alunos:trabalho_final:maushima:imagem22.png?200|}} ====== **Maurício Shimabukuro** ====== Mestre em Oceanografia Biológica pelo IO-USP. Trabalho na área de Ecologia Bêntica, e possuo experiência com identificação de poliquetas marinhos. Atualmente faço doutorado no IO-USP com comunidades de ilhas orgânicas (carcaças de baleia e restos de madeira) em mar profundo. [[.:Exercícios]] ===== **Trabalho Final** ===== [[.:Propostas]] [[.:Proposta B]] //**__Comentários__**// Maurício, a sua proposta A é bacana. Fora a parte do teste estatístico, ela é bem simples. Você pode tentar elaborar a parte do teste estatístico. Uma ideia para deixar a função mais flexível é incluir argumentos para que o usuário escolha quais colunas utilizar como variável preditora e variável resposta. Não ficou muito claro para mim como seria o seu gráfico. Não seria biomassa por localidade? Se for fazer o teste estatístico, defina como será o objeto de saída. Achei a sua proposta B mais interessante. O Danilo (monitor) sugeriu que você olhasse a função polygon para desenhar estes diagramas. Plotar as suas amostras não será algo trivial, então se você decidir tocar esta proposta, saiba que será trabalhoso. \\ --- //[[lucaspdmedeiros@gmail.com|Lucas Medeiros]]// ===== Help da função t.diagram ===== t.diagram R Documentation Diagrama ternário de distribuição Description Função gráfica para construir um diagrama ternário e plotar os valores de porcentagem de três classes de sedimento. Usage: t.diagram(dataset, main="Ternary Diagram", graphic=c("none","quartz","x11"), lab_axs=TRUE, grid=TRUE, pch=19, pch_col="red", pch_cex=1, pch_lab=TRUE, pch_lcol="black", pch_lcex=0.75, pch_lpos=2) Arguments: datasets o objeto de entrada deve ser uma matriz ou data.frame com três colunas. Em cada coluna esta a porcentagem de cada classe de sedimento que se deseja plotar. main título que será colocado no gráfico. Default é "Ternary Diagram". graphic abre um dispositivo gráfico. se colocar "quartz" abre o dispositivo gráfico quartz() com dpi=200, e se colocar "x11" abre o dispositivo x11(). Ver as funções quartz() e x11(). O default do argumento é "none", abre automaticamente o que o R abrirá ao realizar a função plot(). lab_axs se verdadeiro (default) colocará o nome de cada vértice que será o nome das colunas do dataset. Ele coloca os nomes na seguinte ordem: coluna=1 vertice da esquerda; coluna=2 vertice da direita; coluna=3 vertice superior. grid se verdadeiro irá construir a grade da escala de cada vértice entre 0.1 e 0.9. pch tipo de símbolo que será plotado no diagrama; ver argumento pch de parâmetros gráficos pch_col cor do símbolo a ser plotado pch_cex tamanho do símbolo pch_lab se verdadeiro (default) irá colocar marcador do símbolo. O marcador do símbolo é o nome das linhas do dataset pch_lcol cor do marcador pch_lcex tamanho do marcador pch_lpos posição onde irá ser colocado o marcador: 1=abaixo; 2=esquerda; 3=acima; 4=direita. Ver argumento pos da função text() Details: O diagrama é construido dentro de um plano cartesiano xy. A função plota pontos dentro de um triângulo equilátero de lado l e altura h, onde cada vértice equivale a quantidade máxima 100% de uma determinada variável. Este triângulo possui l=1. A altura desse triângulo é igual: h = cos30 = sqrt(3)/2, isso porque: 1) a altura do triângulo é uma reta entre o vértice e o lado oposto. Essa reta divide o ângulo interno em dois ângulos de 30; 2) cos30 = cateto adjacente/hipotenusa, neste caso o cateto adjacente equivale a altura do triângulo equilátero. Como a hipotenusa ou o lado é igual a 1 o cateto adjacente será o próprio cos30, que equivale ao ponto mais alto de y dentro do plano cartesiano. Os pontos que serão plotados possuem 3 coordenadas: p(a,b,c). Quando a possui 100% a coordenada xy no plano cartesiano é a(0,0); quando b 100% b(1,0), e quando c é 100% c(1/2,cos30). Assim p(a,b,c) será (1/2*(2b+c),cos30*c). Lembre-se que a+b+c=1. Value: Se a soma das porcentagens de cada variável (colunas) de alguma amostra (linhas) não por igual a 1 ou 100%, então a função retornará um objeto da classe data.frame contendo a reproporção de cada variável baseada no total original. Este objeto terá mesma dimensão do dado de entrada (mesmo número de colunas e linhas), mas agora a soma das linhas será igual a 1. Warning: O objeto de entrada deve possuir três colunas (variáveis). Se a soma das variáveis não for igual a 1 ou 100% a função irá altomaticamente recalcular este as proporções. ex: Amostra A: areia=35%,silte=40%,argila=15% Amostra A*: areia=38.9%,silte=44.4%,argila=16.7%. Author(s): Maurício Shimabukuro maushima@usp.br Examples: #Leia o arquivo example.csv exe<-read.table("example.csv",sep=",",head=T,row.names=1) t.diagram(example) #construindo gráfico ## crie grupos de objetos: simbolo=rep(15:18,each=6) t.diagram(example,pch=simbolo) ## crie grupos de cores: cor=rep(c("red","darkblue","darkgreen","magenta"),each=6) t.diagram(example,pch_col=cor) t.diagram(example,mais="Exemplo",pch=simbolo,pch_col=cor) ===== Função t.diagram ===== t.diagram <- function(dataset,main="Ternary Diagram",graphic="none",lab_axs=T,grid=T, pch=19,pch_col="red",pch_cex=1,pch_lab=T,pch_lcol="black",pch_lcex=0.75,pch_lpos=2) { if(ncol(dataset)!=3) ##para garantir que existem três entradas de interesse {stop("Dataset must be a matrix or data.frame with 3 columns")} if(any(dataset<0) || any(dataset>1)) ## Os dados devem variar entre 0-1 ou 0-100 {if(any(dataset<0)) stop("X-value of dataset must be >= 0") if(any(dataset>100)) stop("Percentage must be between 0 and 100")} r.sum<-rowSums(dataset) ##total de cada amostra if(any(r.sum>1)) ##verificar em que tipo de escala os dados estão. Se for em porcentagem transformando em valores para escala de 0 a 1 {dataset<-dataset/100 r.sum<-r.sum/100 warning("Percentage transformed into proportions between zero and one")} if(any(r.sum>1)) { stop("The sum of each row must not exceed 1 if dataset scale is 0-1 or 100 if dataset scale is 0-100") } ## verificar se a soma da linha não ultrapassa 1. A soma das tres variaveis de interesse deve ser 1 (ou 100%); foi perguntado aqui para nao ter que fazer duas perguntas if(any(round(r.sum,1)!=1)) {dataset<-dataset/r.sum ## recalculando todas as proporções pois a soma da área do gráfico precisa ser 1. warning("At least one set of dataset does not equal 1; Proportions were recalculated based on dataset")} cos30<-sqrt(3)/2 ## objeto que guarda o coseno de 30; sera utilizado em varios momentos da funcao. Este valor tambem poderia ser calculado pelo teorema de pitagoras: b=sqrt(h^2-a^2), h=1 e a=0.5 entao b=sqrt(0.75) xlim<-c(0,1) ## limites de x da funcao plot() ylim<-c(0,1) ## limites de y da funcao plot() if(graphic!="none") { ## se o argumento graphic for diferente de "none" ira abrir um dispositivo grafico; "none" e o default if(graphic=="quartz") quartz(dpi=200) ## se for "quartz" abrira o dispositivo grafico com a funcao quartz() if(graphic=="x11") x11() ## se for "x11" abrira ao dispositivo com a funcao x11() } par(xpd=T, mar=c(3,2,2,2)) plot(0,type="n",axes=F,main=main,xlim=xlim,ylim=ylim,xlab="",ylab="") ##Gerando área de plotagem polygon(c(0,0.5,1),c(0,cos30,0)) ##Construindo diagrama; a altura do triangulo equivale ao cos30 if(grid){ ## Construindo grade x1=seq(0.1,0.9,by=0.1) ## valores de x para reta inferior x2=x1*0.5 ## valores de x para reta esquerda x3=x2+0.5 ## valores de x para reta direta y1=rep(0,9) ## valores de y para reta inferior y2=x1*cos30 ## valores de y para reta esquerda y3=rev(y2) ## valores de y para reta direita segments(x1,y1,x2,y2,lty=rep(c(3,2)),col=rep(c("gray88","gray"))) ## escala vertice inferior esquerda segments(x2,y2,rev(x3),rev(y3),lty=rep(c(3,2)),col=rep(c("gray88","gray"))) ## escala vertice superior segments(x3,y3,x1,y1,lty=rep(c(3,2)),col=rep(c("gray88","gray"))) ## escala vertice inferior direita sx1=c(0.2,0.4,0.6,0.8) ## valores de x para plotar escala inferior; tambem serao os valores plotados sx2=sx1*0.5-0.03 ## valores de x para plotar escala da esquerda sx3=sx1*0.5+0.53 ## valores de x para plotar escala da direita sy1=rep(-0.03,4) ## valores de y para plotar escala inferior sy2=sx1*cos30+0.01 ## valores de y para plotar escala da esquerda sy3=rev(sy2) ## valores de y para plotar escala da direita text(sx1,sy1,labels=rev(sx1),cex=0.75,font=2) ##plotando escala inferior text(sx2,sy2,labels=sx1,cex=0.75,font=2) ## plotando escala da esquerda text(sx3,sy3,labels=sx1,cex=0.75,font=2) ## plotando escala da direita } if(lab_axs){ lab_axs=colnames(dataset) ## nome dos vertices text(c(-0.05,1.05,0.5),c(-0.05,-0.05,cos30+0.05),labels=lab_axs,cex=1,font=2) } ##colocando nome dos eixos/vertices x.pos=dataset[,2]+(dataset[,3]/2) ## valores de x para plotar no diagrama y.pos=dataset[,3]*cos30 ## valores de y para plotar no diagrama points(x=x.pos,y=y.pos,pch=pch,col=pch_col,cex=pch_cex) ## colocando os pontos no diagrama, as coordenadas são baseadas nos dados de entra com 3 coordenadas ponto(a,b,c) e transformadas em xy ponto(0.5*(2b+c),sqrt(3)/2*c); sendo c o vertice superior, b vertice direta, a vertice esquerda. if(pch_lab){ text(x=x.pos,y=y.pos,labels=row.names(dataset),pos=pch_lpos,cex=pch_lcex, col=pch_lcol) ## colocando legenda dos pontos } if(any(round(r.sum,1)!=1)) {return(dataset) } ## se for necessario recalcular as proporcoes baseado no total da soma das linhas, retorna as novas proporcoes } **__arquivos__** {{:bie5782:01_curso_atual:alunos:trabalho_final:maushima:t.diagram.r|}} {{:bie5782:01_curso_atual:alunos:trabalho_final:maushima:help_t.diagram.r|}} {{:bie5782:01_curso_atual:alunos:trabalho_final:maushima:example.csv|}}