Visualização de Dados com ggplot2

Hellen Sonaly Silva Alves
hellensilva.estat@gmail.com
http://lattes.cnpq.br/4845253626067527


Introdução

A visualização de dados é uma etapa fundamental no processo de análise estatística, pois permite explorar padrões, identificar relações, detectar outliers e comunicar resultados de forma clara e objetiva. Um gráfico bem construído facilita a interpretação das informações e contribui para uma tomada de decisão mais embasada.

No ambiente R, o pacote ggplot2 se destaca como uma das principais ferramentas para construção de gráficos, por ser baseado na Grammar of Graphics, uma abordagem estruturada que organiza a visualização em componentes como dados, mapeamentos estéticos, geometrias e escalas. Essa estrutura em camadas oferece grande flexibilidade e possibilita a criação de visualizações personalizadas e visualmente consistentes.

Neste tutorial, serão apresentados os conceitos fundamentais do ggplot2, desde a estrutura básica de um gráfico até recursos de facetas e customização.


Objetivo do Tutorial

Este tutorial tem como objetivo apresentar os fundamentos da visualização de dados utilizando o pacote ggplot2, explorando os principais conceitos da Grammar of Graphics e aplicando-os na construção de gráficos comuns (dispersão, linhas, barras e boxplots), além do uso de facetas, temas e boas práticas de visualização.


Pacotes e Dados

install.packages("ggplot2")
library(ggplot2)

Datasets utilizados:

  • mtcars: dados sobre características de automóveis.
  • diamonds: informações sobre preços e atributos de diamantes.

O que é a Grammar of Graphics

A Grammar of Graphics organiza um gráfico como uma composição. Em geral, construímos assim:

  1. Dados (data): o conjunto de observações (linhas) e variáveis (colunas).
  2. Mapeamento estético (aes): quais variáveis serão representadas em x, y, color, fill, etc.
  3. Geometria (geom_*): como os dados serão desenhados (pontos, barras, linhas…).
  4. Escalas (scale_*): como valores viram elementos visuais (ex.: cores, limites de eixos).
  5. Facetas (facet_*): como dividir em painéis para comparar grupos.
  6. Tema (theme_*): aparência do gráfico (grades, fontes, etc.).
  7. Rótulos (labs): título, eixos, legenda e fonte.

No ggplot2, os gráficos são construídos adicionando camadas com o operador +.


Estrutura básica do ggplot2

A forma mais comum:

ggplot(data = ..., aes(...)) + geom_*()
  • ggplot() cria o “objeto gráfico” e define dados e mapeamentos.
  • geom_*() define como os dados serão desenhados.
  • Funções como labs(), theme_*() e facet_*() refinam apresentação e comparação.

Exemplo mínimo

ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point()

  • Cada ponto é um carro (uma linha do dataset).
  • wt (peso) está no eixo x.
  • mpg (milhas por galão; consumo) está no eixo y.
  • Se você observar uma tendência descendente, isso sugere que carros mais pesados tendem a ter menor mpg.

Estéticas (aes): o que são e por que importam

As estéticas (aes) definem o “mapeamento” entre variáveis e elementos visuais:

  • x e y: posição
  • color: cor do contorno (pontos/linhas)
  • fill: preenchimento (barras, boxplot, áreas)
  • size: tamanho
  • alpha: transparência
  • shape: forma do ponto

Exemplo: colorindo por categoria (cyl)

ggplot(mtcars, aes(x = wt, y = mpg, color = factor(cyl))) +
  geom_point(size = 3) +
  labs(color = "Cilindros")

  • Agora os pontos são coloridos por número de cilindros.
  • Isso ajuda a perceber se existe diferença entre os grupos (ex.: carros de 8 cilindros podem concentrar-se em maior peso e menor mpg).
  • O uso de factor(cyl) faz a legenda tratar cyl como categoria, não como número contínuo.

Principais geoms (com interpretação)

1) geom_point() – Gráfico de dispersão

Quando usar

  • Para investigar relação entre duas variáveis numéricas.
  • Para ver tendência (cresce/diminui), forma (linear/não linear), clusters e outliers.

Exemplo básico

ggplot(mtcars, aes(wt, mpg)) +
  geom_point() +
  labs(x = "Peso (wt)", y = "Consumo (mpg)")

Como interpretar

  • Direção: se os pontos descem com o aumento de wt, a relação é negativa.
  • Força: quanto mais “alinhados”, mais forte é a relação.
  • Outliers: pontos muito distantes podem indicar carros atípicos.

Dispersão com linha de tendência (geom_smooth())

ggplot(mtcars, aes(wt, mpg)) +
  geom_point() +
  geom_smooth(method = "lm", se = TRUE) +
  labs(title = "Dispersão com tendência linear")

  • A linha representa a tendência estimada por um modelo linear.
  • A faixa sombreada (se = TRUE) representa uma incerteza (intervalo) em torno da estimativa.
  • Se a linha tem inclinação negativa, indica tendência de queda de mpg com wt.

Dica: geom_smooth() não prova causalidade; ele descreve tendência.


2) geom_line() – Gráfico de linhas

Quando usar

  • Para dados com ordem natural no eixo x (tempo, sequência, ranking).
  • Em geral cada linha representa uma série.

Exemplo

df <- data.frame(
  tempo = 1:10,
  valor = c(2, 3, 5, 4, 6, 7, 8, 8, 9, 10)
)

ggplot(df, aes(tempo, valor)) +
  geom_line(linewidth = 1) +
  geom_point(size = 2) +
  labs(x = "Tempo", y = "Valor", title = "Exemplo de gráfico de linha")

  • A linha conecta pontos em ordem de tempo.
  • Aumentos e quedas indicam variação ao longo do eixo x.
  • Os pontos ajudam a ver os valores observados (e não apenas a linha “passando”).

Observação importante: geom_line() conecta os pontos na ordem do eixo x. Se seus dados estiverem “fora de ordem”, a linha pode ficar confusa.


3) geom_bar() vs geom_col() – Barras

Ideia geral

Gráficos de barras são usados para comparar quantidades por categoria.

geom_bar() (contagem automática)

Por padrão, geom_bar() usa stat = "count", ou seja: ele conta quantas linhas existem em cada categoria.

ggplot(mtcars, aes(x = factor(cyl))) +
  geom_bar() +
  labs(x = "Cilindros", y = "Frequência", title = "Contagem por categoria")

  • Cada barra é uma categoria de cyl.
  • A altura da barra é o número de carros com aquele número de cilindros.
  • É útil para ver distribuição de frequências.

geom_col() (valores já prontos)

Use quando você já tem um valor numérico por categoria (média, soma, proporção…).

media_mpg <- aggregate(mpg ~ cyl, data = mtcars, FUN = mean)

ggplot(media_mpg, aes(x = factor(cyl), y = mpg)) +
  geom_col() +
  labs(x = "Cilindros", y = "Média de mpg", title = "Média de mpg por cilindros")

  • A barra agora representa a média de mpg em cada grupo de cilindros.
  • Diferenças entre barras sugerem diferenças de consumo médio.

Dica: geom_bar() = conta linhas. geom_col() = usa valores que você fornece.


4) geom_boxplot() – Boxplot

Quando usar

  • Para comparar distribuições de uma variável numérica entre grupos.
  • Para enxergar dispersão, assimetria e possíveis outliers.
ggplot(mtcars, aes(x = factor(cyl), y = mpg)) +
  geom_boxplot() +
  labs(x = "Cilindros", y = "mpg", title = "Distribuição de mpg por cilindros")

Como interpretar o boxplot (peça por peça)

Para cada grupo:

  • Linha no meio da caixa: mediana (50% abaixo, 50% acima).
  • Caixa: vai do 1º quartil (Q1) ao 3º quartil (Q3).
    Isso é o intervalo interquartil (IQR), onde está o “miolo” dos dados.
  • Bigodes: vão até valores próximos aos extremos (até 1,5 × IQR).
  • Pontos fora: possíveis outliers.

Se um grupo tem caixa mais alta, tende a ter mpg maior.
Se a caixa é mais alta/estreita, indica maior/menor variabilidade.


Facetas: comparando grupos em painéis

Facetas dividem o gráfico em múltiplos painéis com a mesma estrutura visual.
Isso facilita comparar padrões entre grupos sem misturar tudo no mesmo painel.

facet_wrap() – vários painéis por uma variável

ggplot(mtcars, aes(wt, mpg)) +
  geom_point() +
  facet_wrap(~ factor(cyl)) +
  labs(title = "Dispersão por número de cilindros")

  • Você tem um gráfico para cada grupo de cilindros.
  • É útil para verificar se a relação wt vs mpg muda de um grupo para outro.
  • Como as escalas normalmente são iguais, comparar fica mais direto.

Dica: facetas são ótimas quando a sobreposição no mesmo painel atrapalha.

facet_grid() – grade (linhas e colunas)

ggplot(diamonds, aes(carat, price)) +
  geom_point(alpha = 0.2) +
  facet_grid(cut ~ color) +
  labs(title = "Preço vs quilates por cut (linhas) e color (colunas)")

  • Cada painel corresponde a uma combinação de cut (linha) e color (coluna).
  • Isso permite comparar como a relação entre quilates e preço varia entre essas combinações.
  • alpha = 0.2 ajuda porque há muitos pontos no dataset diamonds.

Observação: com muitas facetas, o gráfico pode ficar visualmente pesado. Use quando a comparação realmente for útil.


Temas e customização: deixando o gráfico mais “publicável”

Títulos, subtítulos e rótulos

ggplot(mtcars, aes(wt, mpg, color = factor(cyl))) +
  geom_point(size = 3) +
  labs(
    title = "Consumo vs Peso",
    subtitle = "Comparação considerando o número de cilindros",
    x = "Peso (wt)",
    y = "Consumo (mpg)",
    color = "Cilindros",
    caption = "Fonte: dataset mtcars (R base)"
  )

  • title e subtitle contextualizam o que está sendo mostrado.
  • caption indica fonte (importante em relatórios acadêmicos).
  • Rótulos claros tornam o gráfico interpretável sem explicação extra.

Temas prontos

ggplot(mtcars, aes(wt, mpg)) +
  geom_point() +
  theme_minimal() +
  labs(title = "Tema minimal")

Temas comuns:

  • theme_minimal() → visual limpo
  • theme_classic() → sem grade de fundo, visual “clássico”
  • theme_bw() → fundo branco e grade padrão
  • theme_light() → variação mais leve com grade

Ajustes com theme()

ggplot(mtcars, aes(wt, mpg)) +
  geom_point(size = 2) +
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold"),
    axis.title = element_text(size = 12)
  ) +
  labs(title = "Exemplo de customização")


Boas práticas de visualização

  • Escolha o gráfico de acordo com o tipo de variável e objetivo (comparar, relação, distribuição).
  • Evite excesso de informação visual (muitas cores, muitas grades, textos longos).
  • Use títulos e rótulos claros, eixos com unidades sempre que possível.
  • Em datasets densos, controle sobreposição com alpha, jitter ou agregação.
  • Mantenha consistência de estilo em relatórios (mesmo tema, padrões de legenda).

Exercícios

  1. Crie um gráfico de dispersão de hp (x) vs mpg (y), colorindo por cyl.
  2. Faça um boxplot de wt por gear.
  3. Construa um gráfico de barras com a contagem de gear.
  4. Faça um scatter de carat vs price no diamonds, usando alpha e facetas por cut.

Gabarito sugerido

# 1
ggplot(mtcars, aes(hp, mpg, color = factor(cyl))) +
  geom_point(size = 2)

# 2
ggplot(mtcars, aes(factor(gear), wt)) +
  geom_boxplot()

# 3
ggplot(mtcars, aes(factor(gear))) +
  geom_bar()

# 4
ggplot(diamonds, aes(carat, price)) +
  geom_point(alpha = 0.2) +
  facet_wrap(~ cut)


Conclusão

Neste tutorial, foram apresentados os fundamentos da visualização de dados com o pacote ggplot2, destacando os principais conceitos da Grammar of Graphics, a estrutura em camadas, o uso de estéticas, geometrias, facetas e customização por temas.

A interpretação correta dos gráficos é tão importante quanto sua construção: compreender o que cada elemento representa (pontos, linhas, caixas, barras) é essencial para tirar conclusões adequadas e comunicar resultados com clareza.

Com prática, o ggplot2 se torna uma ferramenta poderosa para produzir visualizações consistentes e profissionais em relatórios, artigos e apresentações.