sexta-feira, 28 de janeiro de 2022

Automatizando código para criação de gráficos

Suponha que você tenha um data frame (ou uma matriz) com notas de alunos, em que cada coluna representa uma matéria. Suponha também que você queira fazer um gráfico (dispersão, histograma,...) para as notas dos alunos de cada matéria. Se há dez disciplinas, você precisa de dez blocos de código para construir esses gráficos? A resposta é não!

Sabendo identificar os padrões dos gráficos que você quer criar, automatizar a criação destes poupa (e muito) seu trabalho. Hoje, vamos aprender a construir gráficos que são semelhantes, sem a necessidade de criar um bloco de código para cada gráfico.

Voltando ao exemplo, vamos construir um data frame com notas de 100 alunos em 5 disciplinas.

dados = matrix(data = ceiling(runif(500)*100), nrow=100,ncol=5);
colnames(dados) =  c("Matematica","Fisica","Biologia","Quimica","Portugues");
dados = as.data.frame(dados);

No caso, eu gerei as notas dos alunos através de uma distribuição Uniforme, para termos o exemplo. Podemos visualizar o que temos no data frame:

head(dados)

> head(dados)
  Matematica Fisica Biologia Quimica Portugues
1         26      5      100      35        46
2         99     61       56      58        14
3         20     93       50      51        56
4         50     57       73      38        27
5         67     77       21      89        41
6         56     30       41       1        38

Como não fixei uma semente, os valores para você estarão diferentes. De fato, são irrelevantes para o propósito desse post, então não se preocupe com isso.

Podemos fazer um gráfico com todas as variáveis (que estão nas colunas), digitando:

plot(dados)

O que nos dá o seguinte gráfico:

Esse gráfico é excelente para uma análise exploratória se quisermos visualizar como as variáveis se relacionam duas a duas. Mas não é nosso caso. Vamos construir um histograma para cada disciplina. Por exemplo, o código abaixo nos dará o seguinte gráfico:

hist(dados$Matematica,xlab='Nota',ylab='Frequência',main='Matematica')
Até aqui nada de novo. O que queremos é construir o histograma acima para cada disciplina sem a necessidade de escrever a linha de código para cada uma. Isso é possível, como eu disse, identificando os padrões dos gráficos que você quer criar.

Por exemplo, para construir o histograma da disciplina de "Fisica", basta alterar dados$Matematica para dados$Fisica (e os respectivos labels no gráfico). Porém, dessa forma, fica complicado automatizar nosso código. Devemos escrever "Fisica" ou "Biologia" para acessar tais colunas? Não! Podemos simplesmente acessar as colunas, isto é, para acessar as notas de matemática, digitamos dados[,1], para as notas de física, dados[,2]. Agora sim podemos acessar as disciplinas presente nos dados percorrendo as colunas do nosso data frame. O código acima será escrito por


hist(dados[,1],xlab='Nota',ylab='Frequência',main='Matematica')

e dará o mesmo resultado. Você deve ter percebido o padrão aqui. Mudamos a disciplina trocando o número da coluna que queremos acessar em dados. Note que também temos que alterar o título do gráfico. Para isso, basta digitarmos colnames(dados)[1], por exemplo, para acessar o nome da coluna "Matematica".

Vamos fazer o código para gerar os histogramas para as cinco disciplinas. Basta colocarmos a linha de código acima dentro de uma estrutura de repetição, alterando a coluna que será acessada do nosso data frame. Vejamos:

par(mfrow=c(2,3))

for(i in 1:ncol(dados)) hist(dados[,i],xlab="Nota",ylab='Frequência',main=colnames(dados)[i])

A primeira linha de código acima apenas diz para o R fazer uma grade de plots com espaço para 6 gráficos (2 linhas e 3 colunas).

A segunda linha de código é nossa automatização da construção dos histogramas. O que fizemos ali? Para cada coluna do data frame, construímos o histograma referente a coluna (disciplina). O gráfico abaixo é o resultado da execução do código acima.


Interessante, não acha? Apenas com uma linha de código, construímos os histogramas para cada uma das disciplinas dos nossos dados. Se tivéssemos 14 disciplinas, apenas uma linha de código seria suficiente para construir um gráfico para cada uma. Esse é o potencial da automatização de código.

Agora, nem sempre queremos apenas plotar e visualizar o gráfico, mas salvá-los! Vamos fazer isso: salvar nossos histogramas de modo automático. Para isso, utilizaremos a função png (que salva os gráficos em formato .png). Vamos ao código:

diretorio = "imagens/";

for(i in 1:ncol(dados)){
  nome = paste0(diretorio,"grafico_notas_",colnames(dados)[i],".png")
  png(nome,width=480,height=480,pointsize=18)
  
  plot(dados[,i],xlab="Aluno",ylab=colnames(dados)[i],pch=19)
  
  dev.off()
}

Agora a explicação:

  1. Para salvar um arquivo, precisamos saber onde salvar. No caso, o R já está no diretório do meu projeto e quero gravar o arquivo na pasta "imagens". Dessa forma, guardo essa informação na variável diretorio.
  2. Como o nome do gráfico muda para cada disciplina, a variável contendo o nome deve estar dentro da estrutura de repetição. No caso, concatenei o diretorio + "grafico_notas" + disciplina + ".png". Nunca se esqueça de colocar a extensão correta do arquivo. Um exemplo de nome é "imagens/grafico_notas_Matematica.png", ou seja, o arquivo "grafico_notas_Matematica.png" será gravado na pasta imagens.
  3. Para começar a gravação, utilizamos a função png, passando como atributo o nome para gravação. Width informa a largura do gráfico, height informa a altura e pointsize o tamanho dos pontos no gráfico.
  4. Em seguida, plotamos o que queremos salvar. Note que, quando iniciamos a função png, o plot será gravado no arquivo e nada aparecerá no ambiente do R.
  5. Para finalizar a gravação, digitamos dev.off().

Se você executar o código acima, verá que, na pasta "imagens", haverá cinco arquivos, que são os histogramas das notas dos alunos em cada disciplina:


Dessa forma, fica bem mais fácil de construir os gráficos para análise. E vimos apenas um exemplo, mas essa ideia serve para qualquer situação em que você tenha que fazer vários gráficos semelhantes. Um exemplo bem comum é a construção da trajetória das cadeias dos parâmetros em inferência Bayesiana. O gráfico é o mesmo para parâmetros diferentes. Automatizar a construção desses gráficos poupa bastante tempo e trabalho.

Espero que tenha gostado da aula.

Até a próxima aula!

Nenhum comentário:

Postar um comentário