02_tutoriais:tutorial5b:start

Diferenças

Aqui você vê as diferenças entre duas revisões dessa página.


02_tutoriais:tutorial5b:start [2025/09/23 19:34] (atual) – criada - edição externa 127.0.0.1
Linha 1: Linha 1:
 +<WRAP tabs>
 +  * [[02_tutoriais:tutorial5b:start|Tutorial]]
 +  * [[01_curso_atual:exercicios5b| Exercícios]]
 +  * [[03_apostila:10-graficos02| Apostila]] 
 +</WRAP>
 +====== 5b. Gráficos II: um procedimento ======
  
 +<WRAP center round box 60%>
 +{{ youtube>cmyd36V9Iow }}
 +</WRAP>
 +
 +Nesse tutorial apresentamos um procedimento para a construção de gráficos no R, incluindo cada elemento separadamente. O objetivo é mostrar como é possível editar e incluir elementos gráficos da forma que desejar, o que permite a construção de gráficos muito complexos. Utilizaremos o gráfico publicado por uma de nossas primeiras alunas para exemplificar o procedimento adotado para produzir gráficos no R.
 +
 +
 +O procedimento tem início com um esboço do gráfico. Nesse caso, fizemos um esboço no guardanapo de papel em um boteco. Essa é a parte mais complicada, imaginar algo que represente os nossos dados de forma sintética, de fácil leitura, esteticamente agradável e adequado à revista em que será publicado. 
 +
 +
 +
 +<WRAP center round box 60%>
 +
 +{{  :02_tutoriais:tutorial5b:graphiCam.png?400  |}}
 +
 +</WRAP>
 +
 +
 +
 +
 +
 +Para simplificar nosso procedimento neste tutorial, vamos produzir apenas uma variação de um dos painéis. Ou seja, queremos algo como:
 +
 +<WRAP center round box 60%>
 +{{  :02_tutoriais:tutorial5b:metagrafA.png?400  |}}
 +</WRAP>
 +
 +
 +Apesar de ser um gráfico simples, apresenta algumas complicações inerentes ao tipo de gráfico que não é padrão. 
 +
 +===== Abrindo o dispositivo =====
 +
 +Quando o dispositivo de tela é aberto pelas funções de alto nível, os parâmetros que serão abertos são aqueles definidos pelo valores que estão no ''par''. Um parâmetro importante é a dimensão do dispositivo. Dependendo do tamanho e da razão entre altura e largura, os elementos podem ter sua posição relativa muito diferente. Inclusive, sobrepondo elementos. Para evitar esse tipo de complicação é importante que a janela gráfica de tela tenha as mesmas dimensões e razão da figura final que deverá ser construída em um dispositivo de arquivo. Quando possível é interessante também trabalhar com a mesma resolução da imagem, associada ao tamanho da janela e o tamanho do pixel. Entretanto, esse último é mais complicado de ser definido no dispositivo de tela. 
 +
 +O tamanho padrão do dispositivo de tela é 7 polegadas de altura e de largura. Para controlar essas dimensões abrimos o dispositivo de tela com os argumentos ''width'' e ''height'', como a seguir:
 +
 +
 +<code rsplus> 
 +X11(width = 10, height = 10)
 +</code>
 +
 +<WRAP center round important 60%>
 +Quando submeter os exercícios no notaR, **não abra o dispositivo gráfico**! Deixe as funções de alto nível abrirem o dispositivo com o tamanho padrão.
 +</WRAP>
 +
 +===== Criando o layout =====
 +
 +Como os elementos da legenda do eixo à direita são complexos, vamos tratá-los como um painel à parte. No [[02_tutoriais:tutorial5:start|primeiro tutorial de gráficos]] utilizamos o parâmetro ''mfrow'' para dividir o dispositivo gráfico em partes simétricas. A função ''layout'' é mais flexível e permite criar painéis de diferentes tamanhos no dispositivo gráfico. No nosso caso, vamos criar duas colunas, a esquerda com 80% da largura total e a direita com 20% restante. O primeiro argumento da função é uma matriz com a sequência com que os painéis irão ser desenhados ((Para juntar painéis em um único elemento basta indicar o mesmo valor na matriz)). 
 +  
 +<code rsplus>
 +layout(matrix(c(1, 2), ncol = 2, nrow = 1), width = c(8, 2))
 +layout.show(2) # mostra o layout dos dois paineis
 +</code>
 +
 + 
 +===== Iniciando o gráfico =====
 +
 +A primeira coisa a fazer depois de definir o layout do gráfico é ajustar os parâmetros gráficos globais do primeiro painel. Em seguida, construímos o espaço de coordenadas sem nenhum elemento utilizando uma função de alto nível, como o ''plot''. Note que o espaço de coordenadas deve estar relacionado às amplitudes dos dados que serão grafados. 
 +
 +<code rsplus>
 +
 +par (mar = c(5, 1, 4, 5))
 +plot(x = NULL, y = NULL, xlim = c(-1.5, 2.5), ylim = c(0.5, 7.5), type = "n", yaxt = "n", xlab = "Effect Size (lnOR)", ylab = "", main = "SURVIVAL")
 +
 +</code>
 +
 +==== Linhas guias e eixo ====
 +
 +Em seguida, continuamos inserindo elementos. Abaixo utilizamos a função ''abline'', a função que desenha linhas de regressão (y = ''a'' + ''b''x) utilizando os parâmetros ''v'' para linha vertical e ''h'' para linha horizontal. O parâmetro ''lty'' define o tipo de linha, no caso ''2'' é a linha tracejada. Outras funções também fazem essa tarefa, como por exemplo ''segments'' que usaremos mais a frente.
 +
 +<code rsplus>
 +abline (v = 0, lty = 2) 
 +abline (h = c(3,6))
 +axis(side = 4, at = c(1,2,4,5,7), labels=c("adult (2)", "young (28)", "temperate (28)", "tropical (2)", "overall (30)"),las=2 ) 
 +</code>
 +
 +Utilizamos no código acima a função ''axis'' para construir o eixo e seus elementos. O lado do eixo é definido pela posição iniciando pelo eixo x como 1 e seguindo no sentido horário. A posição 4 indica o eixo à direita.
 +==== Inserindo os dados ====
 +
 +A lógica desse método é incluir cada elemento separadamente para ter controle total na elaboração do gráfico. Abaixo inserimos os resultados para os adultos:
 +
 +<code rsplus>
 +# ADULT
 +points(x = -0.577, y = 1, pch = 19) # pch: tipo de simbolo
 +points(x = -1.2, y = 1, pch = "|")
 +points(x = 0.05, y = 1, pch = "|")
 +segments(x0 = -1.2, y0 = 1, x1 = 0.05, y1 = 1) # um segmento
 +</code>
 +
 +Agora os resultados para os outros grupos:
 +
 +<code rsplus>
 +#YOUNG
 +points(x = 0.87, y = 2, pch = 19)
 +points(x = -0.05, y = 2, pch = "|")
 +points(x = 1.1, y = 2, pch = "|")
 +segments(x = 1.1, y0 = 2, x1 = -0.05, y1 = 2)
 +#TEMPERATE
 +points(x = 0.01, y = 4, pch = 19)
 +points(x = -0.07, y = 4, pch = "|")
 +points(x = 0.5, y = 4, pch = "|")
 +segments(x = -0.07, y0 = 4, x1 = 0.5, y1 = 4)
 +#TROPICAL
 +points(x = 1.06, y = 5, pch = 19)
 +points(x = 0.946, y = 5, pch = "|")
 +points(x = 2.073, y = 5, pch = "|")
 +segments(x = 2.073, y0 = 5, x1 = 0.946, y1 = 5)
 +#OVERALL
 +points(x = 0.457, y = 7, pch = 19)
 +points(x = 0.025, y = 7, pch = "|")
 +points(x = 0.847, y = 7, pch = "|")
 +segments(x = 0.025, y0 = 7, x1 = 0.847, y1 = 7)
 +</code>
 +
 +
 +===== Segundo painel =====
 +
 +Esse painel foi criado para acrescentar a legenda da direita com suas particularidades. As margens do gráfico não permitem edições complexas. Caso o gráfico tenha elementos nas margens, uma solução é tratar a margem como um painel. Como fizemos no painel anterior, primeiro ajustamos os parâmetros globais e, em seguida, criamos um espaço de coordenadas cartesianas para posicionar os elementos em um espaço vazio. 
 +
 +
 +<code rsplus>
 +
 +par (mar=c(5,2,4,3)) #controla tamanhos das margens
 +plot(x=NULL,y=NULL, xlim=c(0, 2), ylim=c(0.5, 7.5),type="n", xaxt="n", yaxt="n",xlab="", ylab="", bty="n")
 +</code>
 +
 +Em seguida, acrescentamos os elementos e legendas de eixos. Entretanto, diferente do que fizemos no painel anterior, incluindo cada elemento isoladamente, podemos colocar elementos de mesmo tipo juntos, tirando proveito da operação vetorizada das funções e tornando o código mais sintético.
 +
 +
 +<code rsplus>
 +points(x=rep(c(0.5),4), y=c(0.4, 2.6, 3.4, 5.6), pch="-")
 +segments(x0=c(0.5, 0.5), y0=c(0.4, 3.4), x1=c(0.5,0.5), y1=c(2.6, 5.6))
 +axis(side=4, at=1.5, labels= "Target life stage", lwd.ticks=0, cex.axis = 1.5)
 +axis(side=4, at=4.5, labels= "Geographic region", lwd.ticks=0, cex.axis = 1.5)
 +</code>
 +
 +===== Salvando o gráfico =====
 +
 +Para salvar o gráfico em um arquivo, pode-se utilizar a seguinte função. <code rsplus>savePlot</code> Caso esteja usando o RStudio, antes, inicie uma janela gráfica com a função ''X11()''((no windows pode usar a função ''windows()'' e no MacOSx pode precisar usar a função ''quartz()'' )). Para ter mais controle da qualidade gráfica é necessário usar um dispositivo de arquivo (funções ''tiff'', ''jpeg'', ''png'', por exemplo).
 +
 +<code rsplus>
 +savePlot("metaGraf.png", type = "png")
 +
 +
 +</code>
 +
 +
 +/*
 +
 +<WRAP center round box 80%>
 +**__Figura Final__**
 +
 +A revista onde foi publicada a figura solicitou o formato ''tiff'' com tamanho e outros atributos definidos. Para tanto, abrimos um dispositivo ''tiff()'' com os parâmetros solicitados, rodamos o código acima e, ao final, fechamos o dispositivo de arquivo com o ''dev.off()''.
 +
 +{{  :02_tutoriais:tutorial5b:metagraf.jpg?600  |}}
 + 
 +[[https://peerj.com/articles/768/|Castanho, C. T. et al. 2015. ]] A meta-analysis of plant facilitation in coastal dune systems: responses, regions, and research gaps. PeerJ 3:e768 https://doi.org/10.7717/peerj.768.
 +
 +</WRAP>
 +
 +*/
 +
 +
 +===== Gráfico diâmetro e volume de eucaliptos =====
 +
 +
 +
 +Agora vamos  reproduzir o código apresentado em aula que cria o gráfico com os dados de //Eucaliptus grandis//. O planejamento do gráfico foi feito a partir do esboço e ele deve ficar como a figura que segue.
 +
 +<WRAP center round box 95%>
 +
 +{{  :02_tutoriais:tutorial5b:esbGraf.png?400  |}}
 +{{  :02_tutoriais:tutorial5b:egrGraf.png?600  |}}
 +
 +
 +</WRAP>
 +
 +
 +Siga as instruções para chegar ao gráfico como na figura acima: 
 +
 +
 +  - Leia o arquivo {{:dados:egrandis.csv|egrandis.csv}} a partir do seu diretório de trabalho em uma sessão do R, nomeie o objeto como ''egrandis''.
 +  - Garanta que as variáveis foram lidas corretamente e crie o objeto ''tabReg'' com a contagem de quantas observações (''arvore'') tem em cada uma das ''regiao''.
 +  - Crie um objeto chamado ''cores'' com as quatro cores (vermelho, azul, verde e amarelo) que representarão as localidades.  Essas cores devem ser criadas com a função ''rgb'' sem transparência e com valores máximos das cores. 
 +  - Abra um dispositivo de janela com largura de 10 e altura de 8 polegadas. **Essa linha de comando precisa ficar comentada antes de submeter ao notaR, ele não aceita abertura de dispositivos de tela. Mas, é importante manter o tamanho para comparar com a figura enquanto produz o gráfico**. Não modifique o tamanho da janela ao longo do processo, assim as proporções não se alteram.
 +  - Mude os parâmetros globais do dispositivo gráfico para ter: aumento de 20% nos símbolos desenhados no gráfico e sem a borda que define a área gráfica.
 +  - Crie uma estrutura de layout que tenha  4 painéis da seguinte forma: ''matrix(c(1, 2, 3, 1, 4, 4)'' como no esboço da figura.
 +    * proporções de altura ''c(0.13, 0.20,0.67)'' 
 +    * proporções de largura  ''c(0.60, 0.40) ''
 +  - Comece colocando a legenda de localidades no painel superior que tem 13% de altura e toda a largura da figura. Modifique o parâmetro global do painel para que fique sem margens '' mar = c(0, 0, 0, 0)'' e,  desta forma, usar toda a área de plotagem.
 +  - Nessa primeiro painel inicie o gráfico com a função ''plot'' sem nenhum elemento e com as coordenadas cartesianas definidas com o eixo x e o eixo y indo de 0 até 1. 
 +  - Coloque os nomes das localidades em ordem alfabética nas posições em x ''c(0.20, 0.40, 0.60, 0.80)'' e bem no meio da altura (y = 0.5), garanta que a posição do texto em relação às coordenadas é ajustado à esquerda e no meio da altura ((''adj = c(0, 0.5)'')).
 +  - Coloque os símbolos de círculo, preenchido pela cor correspondente de cada localidade, usando a função ''points'' e o símbolo ''pch = 21''  - Utilize as posições ''c(0.19, 0.39, 0.59, 0.79)'' centralizado na altura e sempre com as localidades em ordem alfabética.
 +  - Crie o objeto ''densDap'' com a densidade probabilística da variável ''dap'' usando a função ''density''.
 +  - Ajuste as margens do segundo painel para ''mar = c(1, 8, 1, 1)''
 +  - Inicie a área gráfica com a função ''plot'' sem nenhum elemento, sendo os limites do ''x'' e do ''y'' igual aos limites das variáveis ''x'' e ''y'' do objeto ''densDap''.
 +  - Utilize as variáveis ''x'' e ''y'' do objeto ''densDap'' para fazer o gráfico do painel intermediário utilizando a função ''polygon'' com a cor cinza claro a mesma proporção de vermelho, verde e azul de 0.83.
 +  - Ajuste as margens do painel da figura principal para ''mar = c(5, 8, 1, 1)''.
 +  - Inicie a área gráfica com a função ''plot'' sem nenhum elemento, sendo os limites de máximo e mínimo do eixo ''x'' e do ''y'' iguais aos limites das variáveis ''dap'' e ''vol'' do objeto ''egrandis'', respectivamente.
 +  - Insira os eixos com as respectivas escalas nos eixos ''x'' e ''y'', com a função ''axis'' com os parâmetros base, apenas aumentando em 100% o tamanho dos dígitos das escalas.
 +  - Coloque a legenda do eixo ''x'' e ''y'' como aparece na figura, com a distância da legenda para o eixo de 3 e 5.5 linhas respectivamente, com os caracteres aumentados em 50%.((a função ''expression''  pode ajudar com a junção de caracteres e fórmulas matemáticas para textos de legendas em gráficos))
 +  - Insira os pontos referentes ao gráfico com as cores respectivas para cada região, use ''pch=19''
 +  - Ajuste as margens do painel final contendo o gráfico de caixas para ''mar = c(15, 4, 10, 1)''.
 +  - Faça o ''boxplot'' sem os eixos com as respectivas caixas com as cores das localidades, lembra-se que colocar o argumento ''outline= FALSE'' para excluir os outliers.
 +  - Insira o eixo ''y'' utilizando a função ''axis'' com os parâmetros base, apenas aumentando em 100% o tamanho dos dígitos das escalas.
 +  - Insira a legenda do eixo ''y'' com um aumento de 50% no tamanho dos caracteres e a 3.5 linhas de distância do eixo.
 +
 +
 +
 +===== Atividades: =====
 +
 +
 +<WRAP center round todo 80%>
 +|
 +1. Poste o código e a figura do gráfico //Eucaliptus grandis// no formulário google [[https://forms.gle/hKsR3WjbhRikcUBK8| Exercício 5b.6 Gráfico Eucaliptus grandis]].
 +
 +
 +2. A continuação do nosso tutorial está no exercício do notar [[http://notar.ib.usp.br/exercicio/86| Finalizando o gráfico ]]
 +
 +{{  :02_tutoriais:tutorial5b:metafigOK.png?800  |}}
 +
 +
 +3. Em seguida o desafio é fazer o [[http://notar.ib.usp.br/exercicio/93|gráfico Iris]] como a figura abaixo:
 +{{  :02_tutoriais:tutorial5b:irisGraf.png?600  |}}
 +
 +
 +<WRAP center round info 100%>
 +4. Nesse wiki focamos no uso das ferramentas básicas do R e nesse tutorial no pacote ''graphics'' carregado por padrão na sessão do R. O pacote para elaboração de gráficos chamado ''ggplot2'' vem se tornando muito popular nos últimos anos, mas apresenta uma sintaxe muito diferente da usual no R, o que nos parece não ser muito efetivo para o aprendizado da linguagem. Por essa razão, preferimos deixá-lo de fora do nosso material. 
 +
 +Existem muitos bons tutoriais sobre o ''ggplot2'', inclusive um ótimo feito pelo colaborador da disciplina Gustavo Burin Ferreira, caso tenha interesse acesse:
 +  
 +
 +  * [[https://blog.gburin.com/tutorial-de-ggplot2|]]
 +
 +{{  :02_tutoriais:tutorial5b:ggplot2Gustavo.png?600  |[[https://blog.gburin.com/tutorial-de-ggplot2}}
 +
 +</WRAP>
 +
 +</WRAP>