Gráficos com R e ggplot2
Autor: fernando tenorio | Publicado: 2012-04-24T16:22:00-07:00

Olá pessoal, tudo certo? No post de hoje vamos fugir um pouco dos
algoritmos e dar uma olhada em algo bastante importante para quem lida com
análise de dados e estatística: como criar gráficos complexos e bonitos, de maneira
rápida e fácil? A resposta: usando Linguagem R e o pacote ggplot2!


Como comentado no post sobre Tetris e algoritmos genéticos, 
 R é uma linguagem de programação open source
voltada para análise estatística e gráfica, sendo hoje em dia bastante utilizada
por diversas empresas, incluindo Google, Pfizer, Merck, Bank of America, Shell, entre outras.





A idéia deste post é dar uma introdução prática a criação de gráficos em R, 
sem se preocupar com detalhes de arquitetura ou particularidades da linguagem. Para criar gráficos
em R, temos basicamente três pacotes que já vem instalados por default:


 graphics: Bastante útil para criar gráficos mais simples, como
 histogramas, box-plots, scatter plots, etc. A parte visual pode ser customizada facilmente, mas
 dependendo do grau de customização, pode ser um pouco trabalhoso. 
 
 grid: Este pacote serve mais como um framework de criação e 
 customização dos gráficos, permitindo um controle maior sobre o desenho de primitivas.
 Ao menos que você queira criar o seu próprio framework, você não usará este pacote
 diretamente.
 
 lattice: Usa o pacote grid para implementar um sistema superior ao 
 graphics, permitindo a criação de gráficos mais complexos. Apesar
 das vantagens, extender esse pacote pode ser bastante trabalhoso.





Em resumo, o pacote graphics é bastante útil na criação e análise de gráficos mais comuns, enquanto o pacote
lattice nos ajuda com gráficos mais complexos, do tipo trellis. Dependendo do grau de customização
desejado (tanto no modelo quanto na parte visual), podemos ter bastante trabalho ao usar estes pacotes. 
É aí que entra o ggplot2...


O pacote ggplot2

 ggplot2 foi criado justamente para resolver as limitações discutidas no tópico anterior. Além da parte
 visual muito superior (por default), ggplot2 oferece uma espécie de gramática dos gráficos, com
 a qual podemos desenvolver cada elemento do gráfico em camadas separadas, o que nos permite
 um controle total sobre a aparência do gráfico. Os exemplos desse post são baseados no livro 
 ggplot2: Elegant
 Graphics for Data Analysis, cujo autor é o próprio desenvolvedor do ggplot2. 



 Após instalar o  R, instalar o ggplot2 é bem fácil, basta digitar
 
 
  install.packages("ggplot2")
 
 e aguardar a instalação (você precisa estar conectado).


Shine on your crazy diamond

 Ao trabalhar com gráficos em ggplot2, podemos fornecer os dados como
 variáveis separadas, ou passar um data frame e especificar quais colunas
 serão utilizadas. A segunda opção é a recomendada, por ser mais clara e evitar alguns problemas que podem ocorrer, 
 principalmente quando trabalhamos com diversos pacotes ao mesmo tempo (pesquise o conceito de environment em R para
 saber mais).
 


 Para começar nossa análise, temos um data frame interessante chamado diamonds, 
 localizado no pacote ggplot2. Observe algumas linhas deste dataset:



 carat cut color clarity depthtable pricexyz
 0.2IdealESI261.555.03263.953.982.43
 0.2PremiumESI159.861.03263.893.842.31
 0.3GoodJSI263.358.03354.344.352.75



 De maneira simplificada:

 Carat: é uma unidade de massa, onde 1 carat = 0.2 gramas. Obviamente, quanto maior o 'carat', mais valioso o diamante, mantendo
 as demais características constantes.
 
 
 Cut: quanto melhor o corte, maior a parcela de luz que será refletida através do diamante, tornando-o mais valioso.
 
 
  Color:  A cor mais comum do diamante é o amarelo, e é uma das características mais difíceis de se avaliar. Varia de Z (levemente amarelo) a
  D (completamente transparente e extremamente valioso).
  
  
  Clarity:  representa a pureza interna do diamante. Obviamente, quanto menor o número de impurezas, maior o valor do diamante.
      

 depth, table, x, y e z: são as dimensões do diamante, proporcionais ao volume.
 



As variáveis acima são conhecidas como os '4 C's do diamante'. Após essa humilde introdução ao mundo dos diamante, vamos ao que interessa.


 Quick plot

 Como comentado anteriormente, ggplot2 usa uma espécie de 'linguagem dos gráficos', o que nos permite
 trabalhar em camadas e obter uma customização total do gráfico. Por outro lado, ggplot2 nos oferece a função qplot,
 ou quick plot, que serve como 'atalho' para a criação de gráficos tradicionais. É exatamente essa função que vamos
 usar nos exemplos deste post.


Scatter plots

 Como primeiro exemplo, vamos investigar a relação entre o preço e o carat dos diamantes:
 
  qplot(carat, price, data = diamonds)
 
 ou
 
  qplot(x = carat, y = price, data = diamonds, geom = 'point')
 
 



 Ao investigar a assinatura da função (veja ?qplot), temos uma extensa lista de argumentos, vamos analisar
 os mais importantes:
 
 
  x:  A coluna do data frame que será plotada no eixo x.
  y:  A coluna do data frame que será plotada no eixo y.
  data:  O data frame utilizado para extrair as variáveis especificadas.
  geom:  Define o tipo de gráfico. Repare que nesse caso não precisamos especificar geom = 'point', pois
  ggplot2 usa 'point' como default quando fornecemos x  e y. No caso de fornecermos somente
  x, ggplot2 usa 'histogram' como gráfico default.
 
 
 Repare também que ao passar argumentos em R, podemos nomeá-los ou não. Quando seguimos a ordem
 definida na função, não é necessária nomear, mas quando não sabemos ou não temos certeza deste ordem, é sempre boa 
 prática passar os nomes. No primeiro caso acima, x e y são os 2 primeiros argumentos, então não    precisamos nomear (consulte o help com ?qplot).



 As técnicas de manipulação de dados usadas em R se aplicam normalmente. Por exemplo, podemos observar a 
 relação entre o carat e o volume dos diamantes:
 
 
  qplot(carat, x * y * z, data = diamonds, ylab = 'volume')
 





Além do básico

 Os exemplos anteriores são bastante simples, vamos tentar algo que mostre as vantagens do ggplot2. 
 O dataset diamonds é muito grande, vamos usar uma amostra aleatória deste dataset:
 
 
  nlinhas = 500
  diamantes.amostra = diamonds[sample(nrow(diamonds), nlinhas), ]
 
 Suponha agora que precisamos plotar preço x carat, mas queremos que diamantes com cores
 diferentes sejam plotados com cores diferentes. Usando ggplot2, basta fazer
 
 
  qplot(carat, price, data = diamantes.amostra, colour = color)  
 
 



 e obtemos o gráfico acima. Repare no argumento colour = color, ou seja, separamos a cor
 de cada ponto (atributo colour) de acordo com a coluna 'color' do dataset. Da mesma maneira, podemos plotar
 cada ponto com um símbolo diferente, de acordo com o corte do diamante (coluna 'cut'):
 
 
  qplot(carat, price, data = diamantes.amostra, shape = cut)  
 
 



 Nesse caso especificamos shape = cut, ou seja, o formato de cada ponto varia de acordo com a coluna 'cut' do
 dataset.


Combinando geometrias

 O valor do atributo geoms pode ser uma combinação de valores, desde que a combinação faça sentido. Observe
 o exemplo abaixo, onde adicionamos uma regressão aos pontos:
 
 
  qplot(carat, price, data = diamantes.amostra, geom = c('point', 'smooth'))
 



 
 Podemos especificar o método usado na regressão utilizando o atributo method. Para um regressão linear, basta
 especificar 
 
  qplot(carat, price, data = diamantes.amostra, geom = c('point', 'smooth'), method = 'lm')
 


 Histogramas e gráficos de densidade

 Ao omitir o valor de y, qplot utiliza por padrão a geom 'histogram'. Veja o exemplo abaixo:
 
  qplot(carat, data = diamonds, geom = 'histogram', colour = color)
 
 



 Aqui especificamos a coluna 'color' para enriquecer o histograma. Poderíamos ter usado 'fill' ao invés de
 'colour', o que mudaria a cor de preenchimento das barras. Outro parâmetro importante no histograma é o binwidth,
 que controle o intervalo das classes. Você pode especificar um valor para binwidth, ou aceitar o default. Veja o mesmo gráfico usando binwidth = 0.01: 
 
 
  qplot(carat, data = diamonds, geom = 'histogram', colour = color, binwidth = 0.01)
 
 



 É importante testar esse atributo, pois padrões interessantes podem ser revelados ao se variar o intervalo das classes.



 Gráficos de densidade são uma alternativa interessante aos histogramas, bastando mudar a geometria:
 
  qplot(carat, data = diamonds, geom = 'density', colour = color)
 
 



 Da mesma maneira, podemos controlar a suavidade da curva, desta vez com o atributo adjust. Veja o mesmo
 gráfico com adjust = 0.01:
 
  qplot(carat, data = diamonds, geom = 'density', colour = color, adjust = 0.01)
 
 






 Os exemplos acima são uma pequena amostra das capacidades do ggplot2, certamente teremos mais posts sobre
 o assunto. Fique ligado, e até mais!