Fazendo gráficos bonitos no R

Uma das etapas mais importantes na análise de dados é a visualização dos dados e análises, mas isso nem sempre (eu diria quase nunca :P) é algo simples, especialmente no R. O pacote base do R permite realizar praticamente qualquer gráfico, mas tem um custo bastante elevado (os gráficos padrões são simples, e os mais elaborados são complexos) e devido a isso criou-se a necessidade de pacotes complementares, dentre os quais o que irei falar aqui: ggplot2.

Como descrito na página do pacote, o ggplot2 é um pacote que "tenta pegar partes boas dos pacotes base e lattice e nenhuma parte ruim deles". Apesar de nunca ter usado o lattice, posso afirmar que eles tiveram sucesso nisso, pois o pacote é bastante poderoso e simples de ser utilizado. A ideia aqui é fazer um post semelhante ao que apresenta o pacote data.table, dando apenas uma introdução ao pacote mostrando os gráficos mais utilizados.

Utilizando o ggplot2

O primeiro passo para fazer um gráfico com o ggplot2 é informar os dados que serão utilizados através do comando ggplot(). Com isso, todos os comandos para aquele gráfico usarão os mesmos dados (a menos que seja informado no comando um novo banco de dados). A sintaxe do ggplot2 é bastante diferente do base, tendo um comando separado para cada 'etapa' do gráfico, passados através de uma 'soma'. Vamos aos exemplos (é possível baixar os comandos utilizados aqui).

Histograma

Um gráfico bastante utilizado na análise exploratória é o histograma, por permitir ver como os valores observados se distribuem. Para fazer um, podemos utilizar o comando geom_histogram(), conforme exemplo (todos os exemplos usam como banco da dados um banco simulado, disponível no mesmo arquivo que os códigos):

grafico <- ggplot(dados, aes(x = Idade)) 
grafico + geom_histogram()

O primeiro comando informa os dados (que devem estar em um data.frame/data.table) que serão utilizados e qual variável será representada no eixo x, enquanto o segundo solicita que seja feito um histograma com os dados informados anteriormente (no próximo exemplo vai ficar mais claro como isso funciona), resultando no gráfico:

Exemplo de histograma utilizando o ggplot2
O mesmo gráfico pode ser obtido com: qplot(Idade, data=dados)


Uma pergunta bastante frequente é como acrescentar a curva normal por cima do histograma. Isso pode ser facilmente feito com o ggplot, como podemos ver a seguir:

grafico + geom_histogram(aes(y = ..density..)) + stat_function(fun = dnorm, args = list(mean = 60, sd = 5))

O comando é bastante parecido com o exemplo anterior, mudando apenas dois itens:
  1. Agora é informado no geom_histogram() que no eixo y deve estar a densidade de x, e não a frequência (o padrão é ..count..)
  2. O comando stat_function() coloca no gráfico o resultado da função dnorm (parâmetro fun), com os argumentos informados em args.
Exemplo de histograma com a densidade da normal utilizando o ggplot2.


Agora fica mais fácil de entender a sintaxe do ggplot2. O comando ggplot(dados, aes(x = Idade)) (representado pela variável grafico) cria o gráfico, mas sem nada pois não foi informado ainda que tipo de gráfico; o geom_histogram(aes(y = ..density..)) acrescenta ao gráfico criado anteriormente o histograma e stat_function(fun = dnorm, args = list(mean = 60, sd = 5)) acrescenta a curva normal, e assim por diante até concluirmos o gráfico. Por exemplo, caso quiséssemos mudar os títulos dos eixos, basta acrescentar + xlab('Eixo X') e/ou + ylab('Eixo Y').

Note que ao realizar os 2 gráficos, obtemos o seguinte alerta: stat_bin: binwidth defaulted to range/30. Use 'binwidth = x' to adjust this. Ela apenas informa que as colunas possuem a largura padrão igual a amplitude/30 e que para mudar basta informar o parâmetro binwidth no comando geom_histogram().

Gráfico de dispersão

Outro gráfico bastante utilizado na análise exploratória é o gráfico de dispersão, que auxilia a ver a relação de duas variáveis. Para fazer, devemos utilizar o comando geom_point(), conforme o exemplo:

grafico <- ggplot(dados, aes(x = Idade, y = Felicidade)) 
grafico + geom_point()

Novamente, o comando ggplot() informa os dados que serão utilizados e quais as variáveis utilizadas no gráfico (e seus respectivos eixos) e o geom_point() faz o gráfico de dispersão, resultando em:

Exemplo de gráfico de dispersão utilizando o ggplot2.

Outra pergunta também bastante comum é como acrescentar linha de tendência, que pode ser acrescentada utilizando o comando stat_smooth(), conforme segue:

Exemplo de gráfico de dispersão com linha de tendência linear no ggplot2.
grafico + geom_point() + stat_smooth(method = lm, se = FALSE)
Os parâmetros method e se servem para especificar o tipo de regressão desejada (a padrão é regressão não paramétrica) e para retirar o intervalo de predição (o padrão é TRUE, acrescentando o intervalo). Caso tivessem sido omitidos, teríamos:


Exemplo de gráfico de dispersão com linha de tendência não paramétrica no ggplot2.
grafico + geom_point() + stat_smooth()


Para identificar indivíduos de grupos diferentes, podemos utilizar o parâmetro colour no aes(), que irá colorir conforme a variável indicada. Segue exemplo:

grafico <- ggplot(dados, aes(x = Idade, y = Felicidade, colour = Estado)) 
grafico + geom_point() 

Exemplo de gráfico de dispersão identificando grupos no ggplot2.

Boxplot

O boxplot, assim como o histograma, nos auxilia a ver a dispersão da variável identificando os quartis, os outliers e os valores limítrofes, e pode ser feito através do geom_boxplot(), como vemos a seguir:

grafico <- ggplot(dados, aes(x = Estado, y = Felicidade)) 
grafico + geom_boxplot()

Exemplo de boxplot no ggplot2.
O mesmo gráfico pode ser obtido com: qplot(x = Estado, y = Felicidade, data = dados, geom = 'boxplot')

Gráfico de barras

O último gráfico que irei falar aqui é o gráfico de barras, que serve para vermos a frequência de uma determinada variável e pode ser obtido de duas maneiras diferentes que dependem de como estão os dados, mas ambas utilizando o geom_bar(). Caso os dados não estejam agrupados numa tabela (ou seja, não foram contados), podemos fazer o gráfico utilizando os comandos:

grafico <- ggplot(dados, aes(x = Estado)) 
grafico + geom_bar()

Caso os dados estejam em uma tabela devemos primeiro colocar essa tabela em um formato que o ggplot2 entenda, que é em data.frame. Esse data.frame deve conter 2 colunas, uma com o nível da variável e outra com a frequência desse nível. Por exemplo, utilizando os dados simulados, a tabela deveria ser:

> tabela
  Var1 Freq
1   PR  300
2   RS  329
3   SC  371

Após transformar a tabela em data.frame, podemos montar o gráfico com o seguinte comando:

grafico <- ggplot(tabela, aes(x = Var1, y = Freq))
grafico + geom_bar(stat='identity')


Em ambos os casos, o resultado obtido é (mudando apenas nos títulos dos eixos):

Exemplo de gráfico de barras no ggplot2.

Assim como no geom_point(), no geom_bar() também é possível discriminar por outra variável através do parâmetro fill. Para o caso em que não temos os dados agrupados, teríamos o código

grafico <- ggplot(dados, aes(x = Estado, fill=Sexo)) 
grafico + geom_bar(position = 'dodge')

e no caso de valores já tabelados, teríamos

grafico <- ggplot(tabela, aes(x = Var1, y = Freq, fill=Var2))
grafico + geom_bar(position='dodge')

O parâmetro position define como as colunas serão exibidas: empilhadas (com o valor padrão, stack) ou lado a lado (com o valor dodge). Em ambos os comandos, obtemos:

Exemplo de gráfico de barras discriminando por uma variável no ggplot2.

Note que nos exemplos com os dados tabelados obtemos uma mensagem de alerta no R informando que o padrão do parâmetro stat do geom_bar() é bin, mas como foi informado a variável para o eixo y, foi utilizado o valor identity. Para ocultar esse alerta, basta acrescentar stat='identity' no geom_bar().

Múltiplos gráficos

Para fazer múltiplos gráficos em uma só imagem, basta utilizar o facet_grid() ou facet_wrap() dependendo do resultado desejado. Seguem alguns exemplos utilizando os dois comandos:

grafico <- ggplot(dados, aes(x = Idade, y = Felicidade))
grafico + geom_point() + facet_wrap(~ Sexo)
Exemplo de múltiplos gráficos em uma imagem com o ggplot2.
O mesmo gráfico pode ser obtido com: qplot(x = Idade, y = Felicidade, data = dados, facets = ~ Sexo) 


grafico + geom_point() + facet_wrap(~ Sexo + Estado)
Exemplo de múltiplos gráficos em uma imagem com o ggplot2.
O mesmo gráfico pode ser obtido com: qplot(x = Idade, y = Felicidade, data = dados, facets = ~ Sexo + Estado)


grafico + geom_point() + facet_grid(Sexo ~ Estado)
Exemplo de múltiplos gráficos em uma imagem com o ggplot2.
O mesmo gráfico pode ser obtido com: qplot(x = Idade, y = Felicidade, data = dados, facets = Sexo ~ Estado)


grafico + geom_point() + facet_grid(Sexo ~ Estado) + stat_smooth()
Exemplo de múltiplos gráficos em uma imagem com o ggplot2.
O mesmo gráfico pode ser obtido com: qplot(x = Idade, y = Felicidade, data = dados, facets = Sexo ~ Estado) + stat_smooth()

Considerações finais

Como dito antes, a ideia do post é apenas dar uma introdução e servir de incentivo para que mais pessoas usem o ggplot2, por isso não entrei nas opções de configuração de gráficos (cores, legendas, títulos...). O site do ggplot2 possui vários exemplos ilustrados, então vale a pena dar uma passada la! Os códigos utilizados (e as versões qplot() dos gráficos que permitiram) podem ser baixado aqui. Dúvidas, críticas e sugestões são bem vindas :-)

Um comentário:

Anônimo disse...

Graças ao seu blog consigo ler os dados do Enem e também fazer análises gráficas.

Falta agora comparar as edições.

<3