R

O guia do ggplot2: como fazer qualquer tipo de gráfico no R

Na linguagem R, existem diversas funções para a criação de gráficos. Porém, o pacote ggplot2 traz uma extensão mais ampla, moderna e acessível para visualização de dados, o que o torna um dos pacotes mais usados dentro do Tidyverse.

Neste artigo, vou apresentar todas as funções necessárias para criação de gráficos com o ggplot2.

Para exemplificar as funções, vou usar os datasets que vêm junto ao pacote tidyverse como o diamonds e o mpg. Assim, fica mais fácil para você replicar os códigos no seu computador.

Mas se você quiser outros datasets para praticar ou pesquisar, recomendo buscar no Kaggle ou em alguns dos sites linkados aqui.

Para utilizar o ggplot2, instale o pacote executando a função install.packages(“ggplot2”) e em seguida o carregue executando library(“ggplot2”)Mas recomendo instalar e carregar todo o conjunto de pacotes do Tidyverse, assim você carrega de uma só vez todas as ferramentas básicas necessárias para trabalhar com dados no R. Para isso, instale e carregue o tidyverse executando as seguintes funções:

install.packages(“tidyverse”)

library(“tidyverse”)


Os parâmetros para criação de gráficos

 

A seguir está descrito o template para a criação de qualquer gráfico com o ggplot2, com todos os sete parâmetros que podem ser utilizados. Os parâmetros estão em negrito e entre < >, e são a parte do código em que você deve especificar o argumento desejado.

 

ggplot(data = <DATASET>) +

<GEOM_FUNCTION>(mapping = aes(<MAPPING>), stat = <STAT>, position = <POSITION>) +

<COORDINATE_FUNCTION> +

<FACET_FUNCTION>

Vou entrar em detalhes sobre os parâmetros ao longo deste artigo, mas a seguir descrevo um resumo sobre cada um deles:

  • <DATASET> : o dataset onde estão os dados que você deseja criar o gráfico (Obrigatório).
  • <GEOM_FUNCTION> : a função geom é o objeto geométrico que um gráfico utiliza para representar os dados, como barras, pontos, linhas, boxplots,  etc. (Obrigatório).
  • <MAPPING> : aqui você especifica quais são as variáveis do seu dataset a serem utilizadas. Por exemplo, para um gráfico de dispersão, especificamos mapping = aes(x = variavel1, y = variavel2). (Obrigatório)
  • <STAT> : é a transformação estatística a ser feita nos dados para a criação do gráfico. Cada geom possui um stat padrão, mas caso você queira um stat diferente para aquele geom, ele deve ser especificado.
  • <POSITION> : é a posição em que os objetos do geom se localizam. Cada geom possui uma posição padrão, mas caso você queira uma posição diferente para aquele geom, ela deve ser especificada.
  • <COORDINATE_FUNCTION> : é a função que define o sistema de coordenadas a ser utilizado no gráfico, que por padrão é o sistema cartesiano. Você pode alterar e inverter as coordenadas do gráfico com esta função, por exemplo para alterar um gráfico de colunas para um gráfico de barras.
  • <FACET_FUNCTION> : esta função permite dividir o seu gráfico em subgráficos, geralmente a divisão é realizada por uma variável categorizada, permitindo assim a comparação entre diferentes grupos.

Além destes parâmetros, existem as funções para inserção de títulos e alteração de cores do gráfico, que citarei no final.

É possível criar centenas de milhares de gráficos ao realizar combinações entre estes parâmetros. É muito útil enxergar as funções do ggplot2, em especial os geoms, como camadas.

Não é necessário memorizar todas as funções do ggplot2, apenas entender os conceitos e a lógica dos parâmetros que criam os gráficos. Para ver em detalhes as funções do ggplot2 utilize a ajuda do R, executando ? + função, ou ?? + função. Você também pode ver uma lista das funções apenas digitando ? + o início da função.

Por exemplo, se na criação do seu gráfico você não sabe ou não se lembra qual geom usar, execute ? + geom_. Isto abrirá uma caixa com todas as funções que começam com geom_, e assim você pode ler sobre os detalhes de cada uma:

 

Especificando o dataset e mapeando as variáveis

 

Para criação de gráficos com o ggplot2, inicie com a função ggplot(). Por padrão, o primeiro argumento da função ggplot() é o nome do dataset onde estão os dados que você deseja criar o gráfico. Assim, se você especificar o dataset no primeiro argumento da função ggplot, não é necessário inserir “data = “, você pode inserir apenas o nome do dataset.

Por exemplo, o dataset diamonds, que vem imbutido no tidyverse, pode ser declarado no ggplot no formato:

ggplot(data = dataset)ou simplesmente, ggplot(dataset) .

A especificação, ou mapeamento, das variáveis, é feita utilizando a função mapping = aes() ou simplesmente aes(). Esta função pode ser declarada dentro da função ggplot() ou dentro da função geom, a diferença é que na função ggplot() o mapeamento das variáveis é global para todo o resto do código (muito útil se você estiver trabalhando com múltiplos geoms), enquanto que na função geom o mapeamento é específico para aquele geom.

ggplot(data = dataset, aes(x = variavel1, y = variavel2)) + geom_x()

é equivalente à

ggplot(data = dataset) + geom_x(aes(x = variavel1, y = variavel2))

Leve em consideração que é possível realizar o mapeamento de funções de variáveis, por exemplo aes(x = variavel1 ^ 2).

Além disso, na função aes(), é possível mapear variáveis com o objetivo de agregar mais informação visual ao gráfico.

Por exemplo, num gráfico de dispersão (onde o geom é o geom_point() ), temos que declarar duas variáveis quantitativas dentro do aes() para criar o gráfico. Mas poderíamos agregar mais informação ao gráfico de dispersão ao utilizar cores para exibir as diferentes categorias presentes numa terceira variável. Para isso, especificamos esta terceira variável como argumento de “color” ou “colour”:

ggplot(data=mpg) +
geom_point(mapping = aes(x=displ, y = hwy))

ggplot(data=mpg) +
geom_point(mapping = aes(x=displ, y = hwy, color = class))

 

 

Se caso você não possa ou não queira fazer essa divisão por cores, pode fazer pela transparência dos pontos com alpha (ex: alpha = class) ou pelo formato dos pontos com shape (ex: shape = class). Mas atenção que em shape são aceitos no máximo 6 diferentes categorias.


Objetos geométricos – geoms

 

Irei apresentar aqui um resumo da maioria dos geoms do ggplot2. Para facilitar a apresentação, irei dividir os geoms por quantidade e tipo de variáveis a serem especificadas.

É sempre válido explorar a ajuda da função (?geom_x) para ver os parâmetros que podem ser inseridos na função, assim você usa todo o potencial do geom e deixa o gráfico na formato exato que desejar.

  • Gráficos para uma variável – contínua

c <- ggplot(data=mpg, mapping=aes(x = hwy))

c + geom_area()

c + geom_density()

c + geom_dotplot()

c + geom_freqpoly()

c + geom_histogram()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • Gráficos para uma variável – discreta

ggplot(data=mpg, mapping=aes(x=fl))+
geom_bar()

  • Gráficos para duas variáveis – ambas contínuas

e <- ggplot(data=mpg, mapping=aes(x=cty, y=hwy))

e + geom_point()

e + geom_jitter()

e + geom_smooth()

 

  • Gráficos para duas variáveis – uma discreta e uma contínua

f <- ggplot(mpg, aes(class, hwy))

f + geom_bar(stat=”identity”)

f + geom_boxplot()

f + geom_violin()

 

  • Distribuições contínuas bivariadas

h <- ggplot(diamonds, aes(carat, price))

h + geom_bin2d(binwidth = c(0.25, 500))

h +  geom_density_2d()

h +  geom_hex()

 

 

  • Funções contínuas

i <- ggplot(economics, aes(date, unemploy))

i + geom_area()

i +  geom_line()

 

  • Gráficos para três variáveis

seals$z <- with(seals, sqrt(delta_long^2 + delta_lat^2))
l <- ggplot(seals, aes(long, lat))

l +  geom_contour(aes(z=z))

l +  geom_tile(aes(fill=z))

 

 

 

Veja também: ?geom_map


Transformações estatísticas – stats

 

Alguns geoms realizam uma transformação nos dados para a criação do gráfico. Por exemplo, o gráfico de colunas/barras faz uma contagem de cada observação de uma variável e exibe no gráfico, colunas proporcionais à esta contagem.

“Stats” é uma forma alternativa para criar uma camada.

Ambas as funções stat e geom combinam um stat com um geom para criar uma camada. Por exemplo, stat_count(geom = “bar”) faz o mesmo que geom_bar(stat = “count”).

Use um stat para escolher uma transformação a ser visualizada.

Veja por exemplo este gráfico de colunas para a variável “cut”, que possui 5 diferentes observações:

ggplot(data=diamonds)+
geom_bar(mapping=aes(x=cut))

Perceba no gráfico acima, que no eixo y está descrito “count”. Não tivemos que especificar no nosso código a realização desta contagem, pois a transformação do tipo contagem (count) é a transformação estatística (stat) padrão da função geom_bar.

Veja a lista detalhada de todas as transformações do ggplot2, digitando ?stat_ e navegando pelo menu exibido.

 

Ajustes de Posição – positions

 

Ajustes de posição definem como os geoms se localizam, evitando que ocupem o mesmo espaço.

Por exemplo, você deseja criar um gráfico de barras para duas variáveis. A posição das barras podem ser uma ao lado da outra, empilhadas no tamanho de cada uma, empilhadas mas com a altura normalizada, etc.

Para definir a posição dos seus objetos/elementos, utilize o argumento position =  “x” dentro da função geom. O “x” pode ser declarado nas seguintes formas:

 

  • position = “identity” irá colocar cada objeto na posição exata em que ele cairia no contexto do gráfico. É um ajuste útil para geoms do tipo 2D, como no gráfico de dispersão (geom_point), no qual “identity” é o ajuste de posição padrão. Para gráficos de barras, não é um ajuste muito útil, mas segue como exemplo:

 ggplot(diamonds, aes(x=cut, fill = clarity))+
geom_bar(position=”identity”)

  • position = “dodge” coloca objetos sobrepostos um ao lado do outro. Isto torna mais fácil a comparação de valores individuais:

ggplot(diamonds, aes(x=cut, fill=clarity))+
geom_bar(position=”dodge”)

 

  • position = “fill” irá empilhar os elementos um sobre o outro, mas normalizando a altura. Isso é muito útil para comparar proporções entre os grupos:

ggplot(diamonds, aes(x=cut, fill=clarity))+
geom_bar(position=”fill”)

 

  • position = “jitter” é muito útil para gráficos de dispersão. Um dos problemas do gráfico de dispersão é o chamado overplotting, que ocorre quando dois ou mais pontos estão posicionados no mesmo local do gráfico (como x = 40 e y = 2) e assim a visualização fica comprometida pois só enxergaremos um único ponto naquele local. Ao definir position=”jitter”, o ggplot irá adicionar um ruído aleatório nas posições de X e Y.

Adicionar aleatoriedade pode parecer uma forma estranha de melhorar o seu gráfico, mas enquanto o jitter torna seu gráfico menos preciso em pequena escala, ele torna o seu gráfico mais revelador e significativo em larga escala.

ggplot(mpg, aes(x=displ, y=hwy))+
geom_point(position=”jitter”)

 

Outros ajustes de posição que não irei exemplificar aqui, mas que são bastante intuitivos e fáceis de aplicar são:

  • position = “nudge”, que afasta os rótulos dos pontos.
  • position = “stack”, que empilha os elementos um sobre o outro.

Para obter mais informação sobre qualquer ajuste de posição, veja a página de ajuda associada a cada ajuste:

?position_dodge, ?position_fill, ?position_identity, ?position_jitter, ?position_stack, etc.

 

 

Sistemas de Coordenadas – coordinates

 

O sistema de coordenadas padrão é o Cartesiano, onde as posições de X e Y agem independentemente para encontrar a localização de cada ponto/objeto no gráfico.
Entretanto existem outros sistemas de coordenadas que podem ser bastante úteis para visualização de dados, de acordo com o seu objetivo:

 

  • coord_flip() faz a inversão entre os eixos X e Y. Isso é muito útil quando o número de variáveis que você possui no eixo X é muito extenso e a leitura fica comprometida.
Por exemplo, neste gráfico são exibidos os boxplots de 15 variáveis:
ggplot(mpg, aes(x = manufacturer, y = hwy))+
  geom_boxplot()

 

Se inserirmos a função coord_flip(), os eixos se invertem e o gráfico pode ser melhor visualizado:
ggplot(mpg, aes(x = manufacturer, y = hwy))+
  geom_boxplot()+
  coord_flip() 
Dica: o gráfico de barras nada mais é do que um gráfico de colunas geom_bar() com a função coord_flip().
  • coord_quickmap() é muito útil quando se está trabalhando com dados espaciais. Esta função ajusta corretamente a extensão do seu mapa, em especial quando se usa geom_polygon().
  • coord_polar() transforma o gráfico para o sistema de coordenadas polares. Utilize esta função para criar gráficos de Coxcomb e gráficos de setores.

Exemplo de gráfico de Coxcomb:

ggplot(diamonds, aes(x = cut, fill=cut))+
geom_bar()+
coord_polar()

 

 


Dividindo o gráfico em subgráficos – facets

 

Facetas, ou facets, têm o propósito de dividir um gráfico em subgráficos baseando-se em uma ou mais variáveis discretas (em especial variáveis categorizadas).

Facetas podem ser muito úteis quando você deseja visualizar o comportamento de diferentes categorias num mesmo gráfico.

Por exemplo, estamos visualizando um gráfico de dispersão entre o tamanho do motor de um carro (displ) e o consumo de gasolina por milha percorrida(hwy):

ggplot(data=mpg)+
geom_point(mapping=aes(x=displ, y=hwy))

e então decidimos dividir este gráfico pelo tipo do automóvel(class), assim podemos visualizar o mesmo comparativo mas dividido entre categorias. Para isso usamos a função FACET:

ggplot(data=mpg)+
geom_point(mapping=aes(x=displ, y=hwy))+
facet_wrap(~ class, nrow=2)

Caso queira utilizar a função FACET para uma única variável, use facet_wrap(~ nomedavariavel). O uso do ~ antes da variável é um formato de estrutura de dados no R.

Mas caso você queira utilizar a função FACET como uma combinação de duas variáveis, use facet_grid(variavel1 ~ variavel2).

O nome das variáveis é o único argumento obrigatório da função facet_wrap() ou facet_grid(), mas caso queira especificar o número máximo de sub-gráficos que aparecem, utilize os argumentos nrow= para linhas e ncol= para colunas.


Editando títulos, cores e formatos

 

É possível alterar o título do gráfico e dos eixos utilizando as funções ggtitle(“título do gráfico)xlab(“título eixo x”)ylab(“título eixo y”).

Uma forma alternativa e mais prática, é utilizando a função labs():

ggplot(data=mpg) +
geom_point(mapping = aes(x=displ, y = hwy, color = class)) +
labs(title=”Título do gráfico”, x = “Eixo x”, y = “Eixo y”, color = “Categorias”)

 

 

Veja mais dicas para edição de títulos e cores neste link.

Você pode alterar a aparência de elementos do seu gráfico, declarando dentro da função geom, mas fora da função aes(), aquilo que você deseja editar seguido de um valor ou string válido:

  • Para cores, use colour = “string”, ou color = “string”, para alterar a cor. String no caso deve ser o nome, em inglês, da cor desejada. Ex: geom_point(aes(x = displ, y = hwy), color = “blue”)
  • Para definir o tamanho de pontos, declare o valor, em mm, utilizando size = ” “
  • Para definir o formato de pontos, utilize shape = ” “ e especifique o número do formato correspondente:

 

Para ir além

 

A melhor forma de aprender ggplot2 é praticando e explorando as suas funções, sempre com o apoio da ajuda disponível. Segue abaixo alguns links que podem ser úteis e servir de inspiração para você:

E veja neste link 50 belos gráficos feitos com o ggplot2 com os respectivos códigos. Repare que os códigos nada mais são do que combinações de tudo o que foi abordado neste guia.


 

Espero que este guia lhe tenha sido útil e que você use e abuse da sua criatividade para criar belos gráficos com o ggplot2.

Abraços e até a próxima!