#======================================================================== # Disciplina: Uso da Linguagem R para Análise de Dados em Ecologia - 2014 # Função: Diagrama de Proporções # Autor: Joyce Rodrigues do Prado ratiodiagram<- function(x,name="figura.tif", ngrupos, rmNA=TRUE, erro=TRUE) { dados<-x #Nomeia o objeto de entrada #Se o número de grupos for menor ou igual a 1 não é possível executar a função e aparece uma mensagem de erro. ngrupos<-nlevels(dados[,1]) if (ngrupos<=1) { stop("Atenção! ngrupos deve ser maior que 1.") } #Se o número de grupos for maior que 1 a função executa normalmente. else { grupos<-levels(dados[,1]) # mostra quais são os grupos que serão comparados if (rmNA==FALSE) { stop("Atenção! Não é possível executar a função com NAs.") } else if (erro==TRUE) { media<- aggregate(dados[,-1], list(grupos=dados[,1]), mean, na.rm=T) #calcula a média de cada variável em cada grupo erro<- aggregate(dados[,-1], list(grupos=dados[,1]), function(x, na.rm = T)2* sd(x, na.rm = T)/sqrt(length(x))) # calcula o erro padrão da amostra por variável media_pluserro<-media[,-1]+erro[,-1] # soma o erro padrão à média media_minorerro<-media[,-1]-erro[,-1]# diminui o erro padrão da média logmedia<- log10(media[,-1]) #logaritmiza a média logmedia_pluserro<- log10(media_pluserro) #logaritmiza a soma da média mais erro padrão logmedia_minorerro<- log10(media_minorerro)#logaritmiza a diferença da média mais erro padrão comb1 <- expand.grid(x1=nrow(logmedia), x2=1:nrow(logmedia)) #Faz uma combinação dos grupos para calcular a diferença entre as médias dos grupos XSub1 <- logmedia[comb1$x1,] - logmedia[comb1$x2,] #Calcula a diferença entre as médias dos grupos rownames(XSub1) <- paste(comb1$x1, comb1$x2, sep="-") #Muda os nomes das linhas transposta1<-t(XSub1) #transpõe a matriz pra fazer o gráfico comb2 <- expand.grid(x1=nrow(logmedia_pluserro), x2=1:nrow(logmedia_pluserro)) #Faz uma combinação dos grupos para calcular a diferença entre a soma da média e do erro padrão dos grupos XSub2 <- logmedia_pluserro[comb2$x1,] - logmedia_pluserro[comb2$x2,] #Calcula a diferença entre a soma da média e do erro padrão dos grupos rownames(XSub2) <- paste(comb2$x1, comb2$x2, sep="-") #Muda os nomes das linhas transposta2<-t(XSub2)#transpõe a matriz pra fazer o gráfico comb3 <- expand.grid(x1=nrow(logmedia_minorerro), x2=1:nrow(logmedia_minorerro))#Faz uma combinação dos grupos para calcular a diferença entre a diferença da média e do erro padrão dos grupos XSub3 <- logmedia_minorerro[comb3$x1,] - logmedia_minorerro[comb3$x2,] #Calcula a diferença entre a diferença da média e do erro padrão dos grupos rownames(XSub3) <- paste(comb3$x1, comb3$x2, sep="-") #Muda os nomes das linhas transposta3<-t(XSub3) #transpõe a matriz pra fazer o gráfico nomeslinhas<-rownames(transposta1) #cria um objeto com o nome das variáveis i<- length(nomeslinhas) # calcula número de variáveis max2<- max(transposta2, na.rm =TRUE)#achando o maior valor da matriz transposta2 para usar no eixo y do gráfico max1<- max(transposta1, na.rm =TRUE)#achando o maior valor da matriz transposta1 para usar no eixo y do gráfico max3<- max(transposta3, na.rm =TRUE)#achando o maior valor da matriz transposta3 para usar no eixo y do gráfico min1 <- min(transposta1, na.rm =TRUE)#achando o menor valor da matriz transposta1 para usar no eixo y do gráfico min2<- min(transposta2, na.rm =TRUE)#achando o menor valor da matriz transposta2 para usar no eixo y do gráfico min3 <- min(transposta3, na.rm =TRUE)#achando o menor valor da matriz transposta3 para usar no eixo y do gráfico max<-max(c(max2,max1,max3))#achando o maior valor de todas as transpostas para usar no eixo y do gráfico min<- min(c(min1,min2,min3))#achando o menor valor de todas as transpostas para usar no eixo y do gráfico #Abre um dispositivo tiff para salvar o gráfico. tiff(file= name, width=40, height=15, unit="cm", res=300) #Faz o gráfico par (family="serif")#fonte par(cex= 1)#tamanho dos simbolos par (cex.axis=1)#tamanho caracteres dos eixos par(cex.lab=1.2)# tamanho legenda dos eixos par (tcl=0.3)#posição dos tickmarks par(mgp=c(1.3,0.1,0))#distância da legenda em relação ao eixo par(bty="l")#tipo de caixa gráfica grafico<-matplot(transposta1, lty= c(1,2,3,4,5,6),tcl= -0.2,type="o",xaxt="n", pch=c(0,1,2,3,4,5,6,7,8,9), col="black", xlab="", ylab="", ylim= c(min,max)) axis (side=1, at= c(1:i),label= nomeslinhas,tck=0)#editando eixo x legend("topright", legend = grupos, bty="n", lty= c(1,2,3,4,5,6), pch=c(0,1,2,3,4,5,6,7,8,9))#colocando legenda segments (x0=c(1:i), x1=c(1:i), y0= transposta2, y1= transposta3)#colocando barra de erros segments (x0= c(1:i-0.1), x1= c(1:i+0.1), transposta2, transposta2)#colocando barra de erros segments (x0= c(1:i-0.1), x1= c(1:i+0.1), transposta3, transposta3)#colocando barra de erros #Fecha o dispositivo tiff. dev.off()#fechando dispositivo # Retorna no console o gráfico de proporções return("o gráfico foi salvo na pasta de trabalho") } else { media<- aggregate(dados[,-1], list(grupos=dados[,1]), mean, na.rm=T) #calcula a média de cada variável em cada grupo logmedia<- log10(media[,-1]) #logaritmiza a média comb1 <- expand.grid(x1=nrow(logmedia), x2=1:nrow(logmedia)) #Faz uma combinação dos grupos para calcular a diferença entre as médias dos grupos XSub1 <- logmedia[comb1$x1,] - logmedia[comb1$x2,] #Calcula a diferença entre as médias dos grupos rownames(XSub1) <- paste(comb1$x1, comb1$x2, sep="-") #Muda os nomes das linhas transposta1<-t(XSub1) #transpõe a matriz pra fazer o gráfico nomeslinhas<-rownames(transposta1) #cria um objeto com o nome das variáveis i<- length(nomeslinhas) # calcula número de variáveis #Abre um dispositivo tiff para salvar o gráfico. tiff(file= name, width=40, height=15, unit="cm", res=300) #Faz o gráfico par (family="serif") par(cex= 1) par (cex.axis=1) par(cex.lab=1.2) par (tcl=0.3) par(mgp=c(1.3,0.1,0)) par(bty="l") grafico<-matplot(transposta1, lty= c(1,2,3,4,5,6),tcl= -0.2,type="o",xaxt="n", pch=c(0,1,2,3,4,5,6,7,8,9), col="black", xlab="", ylab="") axis (side=1, at= c(1:i),label= nomeslinhas,tck=0) legend("topright", legend = grupos, bty="n", lty= c(1,2,3,4,5,6), pch=c(0,1,2,3,4,5,6,7,8,9)) #Fecha o dispositivo tiff. dev.off() # Retorna no console o gráfico de proporções return("o gráfico foi salvo na pasta de trabalho") } } }