1 Introdução à Visualização de Dados

1.1 Definição

O que é visualização de dados

A visualização de dados é o processo de transformar informações brutas em representações visuais — como gráficos, mapas, tabelas dinâmicas e diagramas — que facilitam a interpretação dos fenômenos estudados. Ao converter dados numéricos ou textuais em elementos visuais, torna-se mais intuitiva a identificação de padrões, tendências, comparações e anomalias que poderiam passar despercebidas em sua forma original.

Em um cenário em que grandes volumes de dados são produzidos continuamente, a visualização desempenha um papel central na análise e na comunicação de resultados. Ela permite que especialistas e não especialistas compreendam insights relevantes de forma rápida, apoia a tomada de decisões baseada em evidências e contribui tanto para análises exploratórias quanto para apresentações mais claras e impactantes.


2 Softwares Utilizados na Visualização de Dados

Diversas ferramentas foram desenvolvidas para atender às diferentes necessidades de análise e comunicação visual, variando em complexidade, flexibilidade e público-alvo. Entre as mais utilizadas, destacam-se:

  • Excel / Google Sheets – acessíveis e adequados para gráficos simples e análises rápidas.
  • Tableau e Power BI – plataformas de Business Intelligence com foco em dashboards interativos e visualizações avançadas.
  • Python (matplotlib, seaborn, plotly) – linguagem versátil e amplamente adotada na ciência de dados.
  • R – referência acadêmica e profissional pela força de seu sistema gráfico e pela grande disponibilidade de pacotes de visualização.
  • QGIS – software especializado em mapas e análises espaciais.
  • D3.js – biblioteca JavaScript para visualizações altamente customizáveis na web.

Apesar das diferenças, todas essas ferramentas têm como objetivo tornar os dados mais compreensíveis e úteis.


3 Visualização de Dados no R

Entre essas ferramentas, o R se destaca pelo seu sistema gráfico extremamente flexível e poderoso, um diferencial importante em relação a softwares como SAS ou SPSS. No R é possível:

  • criar gráficos padrões com poucos comandos;
  • modificar e combinar elementos gráficos com grande controle;
  • desenvolver visualizações complexas e altamente personalizáveis.

O ecossistema do R reúne diferentes abordagens e filosofias para construção de gráficos:

  • Sistema gráfico base (base R) – simples e poderoso.

  • lattice – voltado para visualizações multivariadas.

  • ggplot2 – baseado na Grammar of Graphics, referência moderna em visualização.

Neste tutorial, começaremos pelo sistema gráfico base, fundamental para compreender os demais.


3.1 Sistemas Gráficos no R

O sistema gráfico base do R organiza suas funções em dois grandes grupos, que refletem maneiras distintas de construir visualizações.

3.1.1 Funções de Alto Nível (High-level plot functions)

São funções que criam gráficos completos, iniciando uma nova janela gráfica e substituindo qualquer gráfico anteriormente existente (a menos que se utilize parâmetros específicos). São ideais para começar uma visualização do zero.

Exemplos:

  • plot()
  • hist()
  • boxplot()
  • barplot()

Essas funções geram imediatamente uma representação gráfica completa, que depois pode ser modificada ou enriquecida.

3.1.2 Funções de Baixo Nível (Low-level plot functions)

São funções usadas para adicionar elementos a um gráfico já existente. Exemplos:

  • lines() — adiciona linhas.
  • points() — adiciona pontos.
  • text() — adiciona textos.
  • title() — adiciona título.

Permitindo personalização incremental gráficos já criados.


3.2 A função plot() – A base dos gráficos no R

A função mais fundamental do sistema gráfico base é a plot().
Em sua forma mais simples, ela cria um gráfico de dispersão:

A função plot() é a mais fundamental do sistema gráfico base. Ela é genérica, ou seja, adapta-se ao tipo de objeto recebido, chamando automaticamente o método apropriado.

x <- rnorm(50)
y <- rnorm(50)
plot(x, y)


3.2.1 A versatilidade da função plot()

plot() é uma função genérica ela identifica o tipo de objeto recebido e invoca o comportamwento automaticamente:

  • plot(xf) → se xf é um fator, cria um gráfico de barras.
  • plot(xf, y) → boxplot de y para cada nível de xf.
  • plot(x.df) → produz pares de gráficos entre todas as variáveis numéricas do data frame.
  • plot(myts) → gráfico de série temporal se o objeto é do tipo ts.
  • plot(xdate, yval) → eixo x formatado como datas, se xdate para objeto Date.
  • plot(f, low, up) → desenha a função f no intervalo especificado.

Ou seja, plot() adapta-se automaticamente ao tipo de dado, tornando-se extremamente versátil.

A seguir são apresentados exemplos detalhados para fixar cada caso.


3.2.2 plot() aplicado a fatores → gráfico de barras

# Vetor fator
x <- factor(c("A", "B", "A", "C", "B", "A"))

# Gráfico gerado: barras por categoria
plot(x, main = "plot() aplicado a fator")

Descrição:

Quando o objeto passado é um fator (factor), o plot() automaticamente conta quantas vezes cada categoria aparece e cria um gráfico de barras com essas frequências.


3.2.3 plot(fator, numérico) → boxplot por categoria

x <- factor(rep(c("Controle", "Tratamento"), each = 20))
x
##  [1] Controle   Controle   Controle   Controle   Controle   Controle  
##  [7] Controle   Controle   Controle   Controle   Controle   Controle  
## [13] Controle   Controle   Controle   Controle   Controle   Controle  
## [19] Controle   Controle   Tratamento Tratamento Tratamento Tratamento
## [25] Tratamento Tratamento Tratamento Tratamento Tratamento Tratamento
## [31] Tratamento Tratamento Tratamento Tratamento Tratamento Tratamento
## [37] Tratamento Tratamento Tratamento Tratamento
## Levels: Controle Tratamento
y  <- c(rnorm(20, 5, 1), rnorm(20, 8, 1.2))
y
##  [1]  5.472942  2.563206  5.458663  5.247438  5.760756  5.724486  4.588139
##  [8]  4.169075  4.831486  4.915217  4.547347  5.577040  6.224563  6.086792
## [15]  5.361529  5.153700  5.028155  6.054739  4.321677  4.285858  8.591143
## [22]  9.167216  6.245244  8.470413  8.448507  7.252416 11.415655  6.895760
## [29]  7.906697  6.393172  8.486069  8.365014  9.956995  9.585205  7.528987
## [36]  9.496525  5.652650 10.403174  7.827366  7.209976
plot(x, y,
     main = "Boxplot gerado por plot(fator, numérico)",
     xlab = "Grupos", ylab = "Valores")

Descrição:

Quando o primeiro argumento é um fator e o segundo é um vetor numérico, plot() gera automaticamente boxplots para cada nível do fator, comparando os grupos. Cada categoria vira uma caixa.


3.2.4 plot(data.frame) → matriz de gráficos (scatterplot matrix)

df <- data.frame(
  x = rnorm(50),
  y = rnorm(50),
  z = rnorm(50)
)

plot(df, main = "plot(data.frame): matriz de dispersão")


x1  <- factor(rep(c("Controle", "Tratamento"), each = 20)) 
y1  <- c(rnorm(20, 5, 1), rnorm(20, 8, 1.2))

df <- data.frame(
  x1 = x1,
  y1 = y1,
  Z1 = rnorm(20)
)

plot(df, main = "plot(data.frame): matriz de dispersão")

Descrição:

Quando recebe um data.frame só com colunas numéricas, plot() produz uma matriz de gráficos de dispersão, comparando cada variável contra as demais. É útil para ver correlações e relações gerais entre variáveis.


3.2.5 plot(ts) → série temporal

ts_data <- ts(rnorm(100), frequency = 12, start = c(2020, 1))

plot(ts_data,
     main = "plot(ts): Série Temporal",
     ylab = "Valor", xlab = "Tempo")

Descrição:

Quando o objeto é uma série temporal (ts), plot() usa automaticamente umgráfico de linha, respeitando frequência, ano e mês do objeto. Ideal para visualizar tendências e variações ao longo do tempo.


3.2.6 plot(Date, numeric) → eixo de datas automaticamente formatado

# Sequência de datas
dias <- as.Date("2023-01-01") + 0:29
dias
##  [1] "2023-01-01" "2023-01-02" "2023-01-03" "2023-01-04" "2023-01-05"
##  [6] "2023-01-06" "2023-01-07" "2023-01-08" "2023-01-09" "2023-01-10"
## [11] "2023-01-11" "2023-01-12" "2023-01-13" "2023-01-14" "2023-01-15"
## [16] "2023-01-16" "2023-01-17" "2023-01-18" "2023-01-19" "2023-01-20"
## [21] "2023-01-21" "2023-01-22" "2023-01-23" "2023-01-24" "2023-01-25"
## [26] "2023-01-26" "2023-01-27" "2023-01-28" "2023-01-29" "2023-01-30"
vari <- rnorm(30)
vari
##  [1]  1.00480154 -0.19554583 -1.24025258 -0.63493382  0.12462371  2.74609273
##  [7]  2.85867133  0.56825298 -1.94066511 -1.86772528 -1.60434969  0.02353332
## [13]  1.09212268  0.05024415  0.55670423  1.17212908  0.07258945 -1.00675279
## [19] -1.25877073  0.83727880  0.95582024  2.01996710 -0.44278529  0.69196671
## [25]  1.23243460  0.21166537 -0.01673592 -1.30035019 -0.28642828 -0.01274271
valores <- cumsum(vari)
valores
##  [1]  1.0048015  0.8092557 -0.4309969 -1.0659307 -0.9413070  1.8047857
##  [7]  4.6634571  5.2317101  3.2910449  1.4233197 -0.1810300 -0.1574967
## [13]  0.9346260  0.9848701  1.5415744  2.7137034  2.7862929  1.7795401
## [19]  0.5207694  1.3580482  2.3138684  4.3338355  3.8910502  4.5830169
## [25]  5.8154515  6.0271169  6.0103810  4.7100308  4.4236025  4.4108598
plot(dias, valores, type = "l",
     main = "plot(Date, numeric)",
     xlab = "Data", ylab = "Valor")

Descrição:

Quando o eixo X contém objetos Date, o plot() formata o eixo automaticamente como datas e produz normalmente um gráfico de dispersão ou linha. Aqui usamos type=“l” para uma linha da evolução diária.


3.2.7 plot(POSIXct, numeric) → datas com horas e minutos

tempo <- as.POSIXct("2023-01-01 00:00:00") + 0:23 * 3600
tempo
##  [1] "2023-01-01 00:00:00 -03" "2023-01-01 01:00:00 -03"
##  [3] "2023-01-01 02:00:00 -03" "2023-01-01 03:00:00 -03"
##  [5] "2023-01-01 04:00:00 -03" "2023-01-01 05:00:00 -03"
##  [7] "2023-01-01 06:00:00 -03" "2023-01-01 07:00:00 -03"
##  [9] "2023-01-01 08:00:00 -03" "2023-01-01 09:00:00 -03"
## [11] "2023-01-01 10:00:00 -03" "2023-01-01 11:00:00 -03"
## [13] "2023-01-01 12:00:00 -03" "2023-01-01 13:00:00 -03"
## [15] "2023-01-01 14:00:00 -03" "2023-01-01 15:00:00 -03"
## [17] "2023-01-01 16:00:00 -03" "2023-01-01 17:00:00 -03"
## [19] "2023-01-01 18:00:00 -03" "2023-01-01 19:00:00 -03"
## [21] "2023-01-01 20:00:00 -03" "2023-01-01 21:00:00 -03"
## [23] "2023-01-01 22:00:00 -03" "2023-01-01 23:00:00 -03"
temperatura <- 20 + rnorm(24)
temperatura
##  [1] 20.42110 20.80313 20.28239 19.73482 21.44806 18.16914 20.54214 19.18215
##  [9] 20.26510 19.80899 18.95355 19.87606 19.97035 19.34514 20.53086 18.19484
## [17] 19.96715 19.05419 20.78874 19.78993 20.13138 18.84905 20.55929 20.65393
plot(tempo, temperatura, type = "o",
     main = "plot(POSIXct, numeric)",
     xlab = "Horário", ylab = "Temperatura (°C)")

Descrição:

Com objetos POSIXct, o eixo X mostra data e hora. É ideal para visualizar dados de alta frequência (horas, minutos). type=“o” plota pontos conectados por linhas.


3.2.8 plot(function, min, max) → gráfico de função matemática

plot(sin, 0, 2*pi,
     main = "plot(função, início, fim)",
     ylab = "sin(x)", xlab = "x")

Descrição:

Quando plot() recebe uma função + intervalo, ele avalia a função em vários pontos automaticamente e traça uma curva matemática. Aqui ele desenha o gráfico do seno de 0 a \(2\pi\).


3.3 Gráficos de Distribuição

O R possui diversas funções prontas para explorar a distribuição de um vetor numérico.
Supondo:

Funções importantes:

  • hist(x) → histograma
  • qqnorm(x) → gráfico Q-Q normal
  • qqplot(x, y) → comparação Q-Q entre dois vetores
  • boxplot(x) → boxplot

  • Exemplo:
x <- rnorm(100)
y <- rt(100, df = 3)

par(mfrow = c(2,2))

hist(x, col = 2)
qqnorm(x)
qqplot(x, y)
boxplot(x, col = "green")


3.4 Gráficos para variáveis fator

library(rpart)
head(car90[,1:7])
##               Country Disp Disp2 Eng.Rev Front.Hd Frt.Leg.Room Frt.Shld
## Acura Integra   Japan  112   1.8    2935      3.5         41.5     53.0
## Acura Legend    Japan  163   2.7    2505      2.0         41.5     55.5
## Audi 100      Germany  141   2.3    2775      2.5         41.5     56.5
## Audi 80       Germany  121   2.0    2835      4.0         42.0     52.5
## BMW 325i      Germany  152   2.5    2625      2.0         42.0     52.0
## BMW 535i      Germany  209   3.5    2285      3.0         42.0     54.5
pie(table(car90$Country))

barplot(table(car90$Type))

O que está sendo feito

  1. pie(table(car90$Country)) → Gráfico de setores das origens dos carros.

    • A função table(car90$Country) conta quantos carros há em cada país de origem.
    • pie() usa essas frequências e cria um gráfico de pizza, mostrando a proporção de carros por país.
    • É útil para visualizar percentuais de categorias.

  1. barplot(table(car90$Type)) → Gráfico de barras do tipo de carros

    • table(car90$Type) conta quantos carros há em cada tipo (Sedan, Sporty, Wagon etc.).

    • barplot() transforma essas contagens em barras, facilitando a comparação entre categorias.

    • Diferente do pie, o barplot destaca melhor diferenças absolutas.


3.5 Gráficos empilhados ou agrupados com barplot()

Quando o argumento é uma matriz, barplot() pode criar gráficos agrupados ou empilhados.

1. Criação da tabela de contingência

tab <- table(car90$Country, car90$Type)
  • A função table() cruza duas variáveis fator do dataset:

    • car90$Country → país de origem do carro

    • car90$Type → tipo do carro

  • O resultado é uma matriz de frequências, em que:

    • linhas = países

    • colunas = tipos de carro

  • Cada célula mostra quantos carros de um país correspondem a um determinado tipo.

Exemplo:

tab <- table(car90$Country, car90$Type)

barplot(
  tab,
  beside = TRUE,
  legend.text = TRUE
)

2. Geração do gráfico de barras agrupadas

barplot(tab, beside = TRUE, legend.text = TRUE)

O que cada argumento faz

  • beside = TRUE

    Informa ao R para não empilhar as barras. Cada categoria de Type aparece lado a lado dentro de cada país. Isso cria um gráfico de barras agrupadas, ideal para comparar grupos.

  • legend.text = TRUE

    Faz o R adicionar automaticamente uma legenda, indicando o significado de cada cor (cada tipo de carro).

Interpretação do gráfico:

  • Cada grupo de barras corresponde a um país.

  • Dentro de cada país, há várias barras lado a lado, cada uma representando um tipo de carro.

  • As alturas das barras mostram quantos carros daquele país pertencem a cada tipo.


3.6 Gráficos para Duas ou Mais Variáveis

Para explorar relações multidimensionais, o R oferece diversas funções:

  • pairs(mydf) → matriz de gráficos de dispersão
  • symbols() → dispersão com símbolos de tamanhos variados
  • dotchart() → gráficos de pontos agrupados
  • contour(), image(), filled.contour() → mapas de contorno
  • persp() → gráficos 3D de superfícies

3.6.1 Exemplo

par(mfrow = c(2,2))

# Imagem 2D
myf <- function(x,y) sin(x) + cos(y)
x <- y <- seq(0, 2*pi, len = 25)
z <- outer(x, y, myf)
image(z, axes = FALSE, main = "A matemática pode ser bonita ...")

# Dotchart
dotchart(t(VADeaths), xlim = c(0,100), cex = 0.6)

# Symbols
symbols(
  airquality$Temp, airquality$Wind,
  thermometers = cbind(0.07, 0.3, airquality$Ozone / max(airquality$Ozone, na.rm=TRUE)),
  inches = 0.15
)

# Gráfico 3D
persp(x, y, z, theta = 45, phi = 45, shade = 0.2)


3.7 Argumentos da função plot()

Argumentos que controlam desde os dados até a aparência do gráfico da função plot().


3.7.1 Estrutura básica

plot(x, y, type = "p", main = NULL, xlab = NULL, ylab = NULL, ...)
  • x, y: vetores numéricos ou fatores representando os dados do eixo X e Y.
  • type: tipo de gráfico, como pontos, linhas ou ambos.
  • main: título principal.
  • xlab, ylab: rótulos dos eixos X e Y.
  • : argumentos adicionais que podem ser passados para personalizar pontos, linhas ou texto.

1. Argumentos principais e adicionais

Argumento Descrição Valor padrão Valores possíveis / exemplos
x Dados do eixo X - (obrigatório) Vetor numérico ou fator
y Dados do eixo Y NULL Vetor numérico ou fator
type Tipo de gráfico "p" "p" (pontos), "l" (linha), "b" (pontos+linha), "o" (overplotted), "h" (histogram-like), "s" (steps), "n" (nenhum)
main Título principal "" String
sub Subtítulo "" String
xlab Label do eixo X Nome de x String
ylab Label do eixo Y Nome de y String
xlim Limites do eixo X Calculados automaticamente Vetor c(min, max)
ylim Limites do eixo Y Calculados automaticamente Vetor c(min, max)
col Cor de pontos/linhas "black" Nome de cor, hexadecimal ou número
pch Símbolo dos pontos 1 0-25 (símbolos predefinidos)
lty Tipo de linha 1 1=contínua, 2=tracejada, 3=pontilhada, 4, 5, 6
lwd Espessura da linha 1 Numérico positivo
asp Aspect ratio (proporção Y/X) NA Numérico ou NA
axes Se os eixos devem ser desenhados TRUE TRUE / FALSE
frame.plot Se o retângulo ao redor do gráfico deve ser desenhado axes TRUE / FALSE
ann Se títulos e labels devem ser adicionados TRUE TRUE / FALSE
bg Cor de fundo de símbolos (pch 21-25) NA Nome de cor, hexadecimal
cex Tamanho relativo de símbolos ou texto 1 Numérico positivo
cex.axis Tamanho dos labels dos eixos 1 Numérico positivo
cex.lab Tamanho dos labels dos eixos 1 Numérico positivo
cex.main Tamanho do título principal 1.2 Numérico positivo
cex.sub Tamanho do subtítulo 1 Numérico positivo
font.main Fonte do título 1 1=normal, 2=negrito, 3=itálico, 4=negrito+itálico
font.lab Fonte dos labels dos eixos 1 1=normal, 2=negrito, 3=itálico, 4=negrito+itálico
font.axis Fonte dos ticks dos eixos 1 1=normal, 2=negrito, 3=itálico, 4=negrito+itálico
las Orientação dos ticks dos eixos 0 0=paralelo, 1=horizontal, 2=perpendicular, 3=vertical
log Transformação logarítmica dos eixos "" "x", "y", "xy"
xaxs, yaxs Tipo de expansão dos eixos "r" "r" (regular, 4% extra), "i" (exato)
panel.first Função executada antes da plotagem do painel NULL Função R
panel.last Função executada após a plotagem do painel NULL Função R

2. Exemplo de uso com personalização completa

x <- 1:5
y <- c(10, 20, 30, 40, 50)

plot(x, y,
     type = "b",        # pontos + linhas
     main = "Exemplo de Gráfico",
     cex.main = 2,  
     sub = "Gráfico",
     cex.sub = 1.5,
     xlab = "Eixo X",
     ylab = "Eixo Y",
     col = 21,
     pch = 19,
     cex = 1.5,
     xaxs = "r",        # limites exatos no eixo X
     yaxs = "r")        # limites exatos no eixo Y

# Desenhar apenas os valores existentes nos eixos
axis(1, at = x)
axis(2, at = y)

x <- 1:5
y <- c(10, 20, 30, 40, 50)

plot(x, y,
     type = "b",        # pontos + linhas
     main = "Exemplo de Gráfico",
     xlab = "Eixo X",
     ylab = "Eixo Y",
     col = "blue",
     pch = 19,
     cex = 1.5,
     xaxs = "i",        # limites exatos no eixo X
     yaxs = "i")        # limites exatos no eixo Y

# Desenhar apenas os valores existentes nos eixos
axis(1, at = x)
axis(2, at = y)

✅ Neste exemplo:

  • type = "b" → combina pontos e linhas.
  • pch = 19 → ponto sólido.
  • xaxs = "i" e yaxs = "i" → limites do gráfico exatamente os valores dos dados, sem expansão.
  • axis() → personaliza os ticks para mostrar apenas os valores reais dos dados.

3.8 Controlando Layout e Margens com par()

A função par() permite configurar parâmetros gráficos globais que afetam a aparência de gráficos criados posteriormente.

3.8.1 Parâmetros de Layout e Estilo

Parâmetro Descrição Valor padrão / Exemplo
mfrow Define múltiplos gráficos organizados em linhas x colunas c(1,1)
Ex.: mfrow = c(2,2)
mfcol Como mfrow, mas preenche por coluna c(1,1)
Ex.: mfcol = c(2,2)
oma Margens externas (outer margins), em linhas de texto oma = c(0,0,0,0)
Ex.: oma = c(2,2,2,2)
mar Margens internas (bottom, left, top, right), em linhas de texto mar = c(5,4,4,2) + 0.1
mai Margens internas em polegadas mai = c(1,1,1,0.5)
pty Proporção do plot ("m" = máximo, "s" = quadrado) "m"
xaxs, yaxs Expansão dos eixos "r" (default), "i" (exato)
las Orientação dos ticks dos eixos 0 = paralelo ao eixo
1 = horizontal
2 = perpendicular
3 = vertical
cex Tamanho relativo de símbolos ou textos Numérico positivo
mgp Distâncias dos elementos dos eixos: título, rótulos, linha do eixo mgp = c(3, 1, 0) (padrão)
Ex.: mgp = c(2, 0.7, 0)


Exemplos de Uso

3.8.2 Ajustando margens

plot(1:5, 1:5, main = "Gráfico com margens ajustadas")

par(mar = c(2,2,2,2) + 0.1)
plot(1:5, 1:5, main = "Gráfico com margens ajustadas")

par(mar = c(2,0,0,0))
plot(1:5, 1:5, main = "Gráfico com margens ajustadas")

par(mar = c(4,5,1,1))
plot(1:5, 1:5, main = "Gráfico com margens ajustadas")

3.8.3 Margens externas e títulos externos

par(oma = c(2,2,2,2))
plot(1:5, 1:5)
mtext("Título externo", outer = TRUE, cex = 1.5)

par(oma = c(0,0,0,0))
plot(1:5, 1:5)
mtext("Título externo", outer = TRUE, cex = 1.5)

3.8.4 Layout de múltiplos gráficos

No sistema base do R, o layout de múltiplos gráficos em uma mesma janela é configurado principalmente por três funções:

par(mfrow = )

par(mfcol = )

layout()

A função par() pode ser usada para exibir múltiplos gráficos em uma mesma janela por meio dos argumentos mfrow ou mfcol. Nesse caso, cria-se uma grade simples em que todos os painéis possuem o mesmo tamanho. Já a função layout() permite construir arranjos mais complexos, nos quais os gráficos podem ter diferentes tamanhos e proporções, oferecendo controle total sobre a área de plotagem.

  • Exemplo para a função par()
par(mfrow = c(2,2))

plot(factor(sample(letters[1:3], 50, TRUE)),
     main = "Fator → Barras")

plot(factor(rep(1:2, each = 30)), rnorm(60),
     main = "Fator + Numérico → Boxplot")

plot(data.frame(a = rnorm(50), b = rnorm(50)),
     main = "Data Frame → Matriz de Dispersão")

plot(sin, -pi, pi,
     main = "Função → Curva")

par(mfrow = c(2, 2))   # 2 linhas x 2 colunas
plot(1:5, 1:5, main = "Gráfico 1")
plot(1:5, 5:1, main = "Gráfico 2")
plot(1:5, c(2,3,5,7,11), main = "Gráfico 3")
plot(1:5, c(11,7,5,3,2), main = "Gráfico 4")

par(mfrow = c(2, 2),oma = c(2,2,2,2))   # 2 linhas x 2 colunas
plot(1:5, 1:5, main = "Gráfico 1")
plot(1:5, 5:1, main = "Gráfico 2")
plot(1:5, c(2,3,5,7,11), main = "Gráfico 3")
plot(1:5, c(11,7,5,3,2), main = "Gráfico 4")


par(mfrow = c(2, 2),oma = c(0,0,0,0),mar=c(0,0,0,0))   # 2 linhas x 2 colunas
plot(1:5, 1:5, main = "Gráfico 1")
plot(1:5, 5:1, main = "Gráfico 2")
plot(1:5, c(2,3,5,7,11), main = "Gráfico 3")
plot(1:5, c(11,7,5,3,2), main = "Gráfico 4")

par(mfrow = c(2, 2),oma = c(2,2,2,2),mar=c(2,2,2,2))   # 2 linhas x 2 colunas
plot(1:5, 1:5, main = "Gráfico 1")
plot(1:5, 5:1, main = "Gráfico 2")
plot(1:5, c(2,3,5,7,11), main = "Gráfico 3")
plot(1:5, c(11,7,5,3,2), main = "Gráfico 4")

par(mfrow = c(2, 2),oma = c(0,1,0,1),mar=c(2.3,2.9,1.5,0),mgp=c(1.3,0.5,0))   # 2 linhas x 2 colunas
plot(1:5, 1:5, main = "Gráfico 1")
plot(1:5, 5:1, main = "Gráfico 2")
plot(1:5, c(2,3,5,7,11), main = "Gráfico 3")
plot(1:5, c(11,7,5,3,2), main = "Gráfico 4")


  • Exemplo para a função layout()
Argumento Uso / Descrição Exemplo
matrix Define o arranjo dos painéis (posição dos gráficos) layout(mat, heights = c(1, 2))
heights Controla alturas relativas das linhas de painéis par(oma = c(2,2,2,2))
widths Controla larguras relativas das colunas de painéis layout(mat, widths = c(3, 1))`
  • Exemplo 1:
mat <- matrix(c(1, 2), nrow = 1)

layout(mat,
widths = c(3, 1))

plot(cars, main = "Gráfico Largo")
plot(pressure, main = "Gráfico Estreito")


  • Exemplo 2:
layout.matrix <- matrix(c(2, 1, 0, 3), nrow = 2, ncol = 2)

layout(mat = layout.matrix,
       heights = c(1, 2), # Altura das linhas
       widths = c(2, 2)) # largura das duas columas

layout.show(3)


  • Exemplo 3:
# Configurando o layout do plot
layout(mat = matrix(c(2, 1, 0, 3), 
                        nrow = 2, 
                        ncol = 2),
       heights = c(1, 2),    # Altura das duas linhas
       widths = c(2, 1))     # largura das duas colunas

# Plot 1: Scatterplot
par(mar = c(5, 4, 0, 0))
plot(x = mtcars$mpg, 
     y = mtcars$hp,
     xlab = "height", 
     ylab = "weight", 
     pch = 16) 
     

# Plot 2: Em cima (height) boxplot
par(mar = c(0, 4, 0, 0))
boxplot(mtcars$mpg, xaxt = "n",
        yaxt = "n", bty = "n", yaxt = "n",
        col = "white", frame = FALSE, horizontal = TRUE)
## Aviso em (function (z, notch = FALSE, width = NULL, varwidth = FALSE, : Argumento duplicado yaxt = "n" foi ignorado

# Plot 3: À direita (boxplot do peso)
par(mar = c(5, 0, 0, 0))
boxplot(mtcars$hp, xaxt = "n",
        yaxt = "n", bty = "n", yaxt = "n",
        col = "white", frame = F)

## Aviso em (function (z, notch = FALSE, width = NULL, varwidth = FALSE, : O argumento duplicado yaxt = "n" foi desconsiderado

3.9 Exportando Gráficos

Em R0, gráficos podem ser salvos em arquivos usando png(), jpeg(), pdf(), tiff() ou svg().

3.9.1 Passos Básicos

  1. Abrir o dispositivo gráfico com a função de exportação.
  2. Criar o gráfico normalmente.
  3. Fechar o dispositivo com dev.off().

3.9.2 Principais Funções e Parâmetros

Função Parâmetro Descrição Valor Padrão / Exemplo
png() filename Nome do arquivo de saída "Rplot%03d.png"
width Largura do gráfico 480 (pixels)
height Altura do gráfico 480 (pixels)
units Unidade de medida para width e height "px"
res Resolução em DPI 72
jpeg() filename Nome do arquivo "Rplot%03d.jpeg"
width Largura 480
height Altura 480
units Unidade de medida "px"
quality Qualidade da compressão (0-100) 75
res Resolução em DPI 72
pdf() file Nome do arquivo "Rplots.pdf"
width Largura em polegadas 7
height Altura em polegadas 7
tiff() filename Nome do arquivo "Rplot%03d.tiff"
width Largura 480
height Altura 480
units Unidade de medida "px"
res Resolução em DPI 72
compression Tipo de compressão "none"
svg() filename Nome do arquivo "Rplot%03d.svg"
width Largura 7
height Altura 7

Exemplos de Exportação

3.9.2.1 PNG

png("grafico.png", width = 800, height = 600, res = 120)
plot(1:10, (1:10)^2, main = "Gráfico PNG")
dev.off()
## png 
##   2

3.9.2.2 PDF

pdf("grafico.pdf", width = 7, height = 5)
plot(1:10, (1:10)^2, main = "Gráfico PDF")
dev.off()
## png 
##   2

3.9.2.3 JPEG

jpeg("grafico.jpeg", width = 800, height = 600, quality = 90)
plot(1:10, (1:10)^2, main = "Gráfico JPEG")
dev.off()
## png 
##   2

3.9.3 Observações

  • Sempre use dev.off() para finalizar o arquivo.
  • Ajuste width, height e res para gráficos em alta resolução.
  • Para múltiplos gráficos em um arquivo, combine com par(mfrow=…).

3.10 Usando letras gregas e símbolos matemáticos em gráficos

No R, você pode usar a função expression() para adicionar símbolos matemáticos, letras gregas, expoentes, subscritos e operadores em títulos, labels e textos dentro de gráficos.


3.11 Letras Gregas Comuns

Letra Código em expression()
α expression(alpha)
β expression(beta)
γ expression(gamma)
δ expression(delta)
θ expression(theta)
λ expression(lambda)
μ expression(mu)
σ expression(sigma)
π expression(pi)

3.12 Exemplos de Uso

x <- 1:5
y <- x^2

# Letras gregas nos títulos e labels
plot(x, y,
     main = expression(alpha + " versus " + beta),
     xlab = expression(theta[gamma]),
     ylab = expression(sigma^2))

# Adicionando texto dentro do gráfico
text(3, 10, expression(mu == 5))

✅ Observações:

  • expression() permite combinar texto normal com símbolos matemáticos.

  • É possível usar expoentes, subscritos e operadores matemáticos, por exemplo:

    • sigma^2 → σ²
    • theta[i] → θᵢ
    • sqrt(x) → √x
    • alpha + beta → α + β

4 Lista de exercícios

4.1 Gráfico de dispersão simples

  • 1.1 Crie dois vetores numéricos x e y:
set.seed(123)
x <- rnorm(50)
y <- rnorm(50)
plot(x, y)


  • 1.2 Personalização do gráfico
plot(x, y, type = "b", pch = 19, col = "blue",
     main = "Gráfico Personalizado",
     xlab = "Eixo X", ylab = "Eixo Y")


  • 1.3 Gráfico com limites definidos
plot(x, y, xlim = c(0,1), ylim = c(0,1))


  • 1.4 Comparação entre tipos de gráficos
par(mfrow=c(2,2))
plot(x,y,type="p", main="p")
plot(x,y,type="l", main="l")
plot(x,y,type="b", main="b")
plot(x,y,type="o", main="o")

par(mfrow=c(1,1))

  • 1.5 Transformação logarítmica
x2 <- runif(50, 1, 100)
y2 <- runif(50, 1, 100)
plot(x2, y2, log = "xy")


4.2 Exercícios com objetos diferentes no plot()

  • 2.1 plot() com fatores
f <- factor(sample(c("A","B","C"), 40, replace = TRUE))
plot(f)


  • 2.2 Boxplot automático
grupo <- factor(sample(c("G1","G2","G3"), 60, replace = TRUE))
valores <- rnorm(60)
plot(grupo, valores)


  • 2.3 Plotar data.frame plot(data.frame)
df <- data.frame(a=rnorm(50), b=rnorm(50), c=rnorm(50))
plot(df)


  • 2.4 Plotar series temporais plot(ts)
serie <- ts(rnorm(120), frequency = 12, start = c(2021,1))
plot(serie)


  • 2.5 Datas e POSIXct
datas <- seq.Date(from=as.Date("2020-01-01"), by="day", length.out=50)
val <- rnorm(50)
plot(datas, val, type="l")

horas <- seq.POSIXt(from=as.POSIXct("2020-01-01 00:00"),
                    by="hour", length.out=50)
plot(horas, rnorm(50), type="l")


4.3 Exercícios: gráficos de distribuição

  • 3.1 Histograma
x <- rnorm(1000)
hist(x, breaks = 20, col = "lightblue")


  • 3.2 Q-Q plot
qqnorm(x)
qqline(x)


  • 3.3 Boxplot simples
boxplot(x, col = "orange")


  • 3.4 Q-Q entre dois vetores
x1 <- rnorm(100)
y1 <- rt(100, 3)
qqplot(x1, y1)


4.4 Exercícios com barplot()

  • 4.1 Frequências simples
car90 <- data.frame(
  Type = sample(c("Sedan","SUV","Truck"), 100, replace=TRUE),
  Country = sample(c("USA","Japan","Germany"), 100, replace=TRUE)
)

barplot(table(car90$Type))


  • 4.2 Gráficos agrupados
barplot(table(car90$Country, car90$Type),
        beside = TRUE, legend = TRUE)


  • 4.3 Gráficos empilhados
barplot(table(car90$Country, car90$Type),
        beside = FALSE, legend = TRUE)


4.5 Exercícios sobre o uso de par()

  • 5.1 Alterar margens
par(mar = c(5,4,4,2))
plot(1:10)

par(mar = c(2,2,2,2))
plot(1:10)

  • 5.2 Layout com múltiplos gráficos
par(mfrow=c(2,2))

hist(rnorm(100))
plot(rnorm(50), rnorm(50))
boxplot(rnorm(100))
plot(sin(seq(0,2*pi,length=100)))

par(mfrow=c(1,1))

  • 5.3 Título externo
par(mfrow=c(2,2), oma=c(2,2,2,2))
plot(rnorm(50))
plot(rnorm(50))
plot(rnorm(50))
plot(rnorm(50))
mtext("Título Geral", outer=TRUE, cex=1.5)

par(mfrow=c(1,1))

4.6 Exercícios: exportação de gráficos

  • 6.1 Exportar em PNG
png("meugrafico.png", width=800, height=600)
#plot(x, y)
dev.off()
## png 
##   2

  • 7.2 Exportar em PDF
pdf("meugrafico.pdf")
#plot(x, y)
dev.off()
## png 
##   2

  • 7.3 Exportar múltiplas páginas
pdf("multiplos.pdf")
plot(rnorm(50))
hist(rnorm(200))
boxplot(rnorm(100))
dev.off()
## png 
##   2

  • 7.4 Exportar com alta resolução
png("alta_res.png", res=300, width=2000, height=1500)
plot(rnorm(100), rnorm(100))
dev.off()
## png 
##   2

4.7 Exercício final (integração completa)

# 1. Vetores
a <- rnorm(100)
b <- rnorm(100)
c <- rnorm(100)

# 2. Data frame
df2 <- data.frame(a, b, c)

# 3. Matriz gráfica
plot(df2)

# 4. Layout 2x2
png("painel_final.png", width=1200, height=900)

par(mfrow=c(2,2), oma=c(2,2,2,2))

plot(a,b)
hist(a)
boxplot(b)
plot(sin(seq(0,2*pi,length=100)), type="l")

# 5. Título externo
mtext("Painel Final – Exercício Integrado", outer=TRUE, cex=1.5)

dev.off()
## png 
##   2
par(mfrow=c(1,1))

5 Introdução ao pacote ggplot2

O ggplot2 (ou simplesmente ggplot) é um pacote da linguagem R voltado para a visualização e construção de gráficos. Ele é um dos pacotes mais populares para essa finalidade, principalmente devido à sua flexibilidade. O pacote foi desenvolvido por Hadley Wickham, criador de outros pacotes importantes do Tidyverse, como tidyr e dplyr.


5.1 7.1 Preparação dos Dados para os Exemplos

Antes de iniciar a utilização do ggplot2, criaremos duas bases de dados que serão usadas ao longo do capítulo:

  • Base 1 — df_2007 (dados de países), usa uma versão adaptada do dataset Gapminder:
library(gapminder)
library(dplyr)

df_2007 <- gapminder %>%
  filter(year == 2007) %>%       # Último ano disponível
  mutate(
    log_gdp_per_capita = log(gdpPercap),
    life_expec = lifeExp,
    continent = continent,
    populacao = pop          # Mantemos o nome usado no texto
  )
head(df_2007)
## # A tibble: 6 × 9
##   country continent  year lifeExp    pop gdpPercap log_gdp_per_capita life_expec
##   <fct>   <fct>     <int>   <dbl>  <int>     <dbl>              <dbl>      <dbl>
## 1 Afghan… Asia       2007    43.8 3.19e7      975.               6.88       43.8
## 2 Albania Europe     2007    76.4 3.60e6     5937.               8.69       76.4
## 3 Algeria Africa     2007    72.3 3.33e7     6223.               8.74       72.3
## 4 Angola  Africa     2007    42.7 1.24e7     4797.               8.48       42.7
## 5 Argent… Americas   2007    75.3 4.03e7    12779.               9.46       75.3
## 6 Austra… Oceania    2007    81.2 2.04e7    34435.              10.4        81.2
## # ℹ 1 more variable: populacao <int>
  • Base 2 — df_feliz (exemplo com agregações por continente/ano)
df_feliz <- df_2007 %>%
  group_by(continent) %>%
  summarise(
    populacao = sum(populacao),
    life_expec = mean(life_expec),
    gdp_media = mean(log_gdp_per_capita),
    year = first(year),
    .groups = "drop"
  )
head(df_feliz)
## # A tibble: 5 × 5
##   continent  populacao life_expec gdp_media  year
##   <fct>          <dbl>      <dbl>     <dbl> <int>
## 1 Africa     929539692       54.8      7.49  2007
## 2 Americas   898871184       73.6      9.02  2007
## 3 Asia      3811953827       70.7      8.74  2007
## 4 Europe     586098529       77.6      9.99  2007
## 5 Oceania     24549947       80.7     10.3   2007

5.2 Formulação: da gramática dos gráficos

A principal característica do ggplot2 é sua formulação baseada na teoria The Grammar of Graphics (A Gramática dos Gráficos), de Wilkinson (2005).

Essa teoria propõe que todo gráfico estatístico pode ser descrito como a combinação de componentes (ou camadas). Em vez de usar funções específicas para cada tipo de gráfico, o ggplot2 permite que você construa visualizações adicionando essas camadas progressivamente.

As camadas essenciais são:

  1. Dados (<DATA>)
  2. Mapeamento Estético (aes())
  3. Geometrias (funções geom_)

Outros componentes incluem transformações estatísticas, sistemas de coordenadas, facets, cores e temas.

5.3 Diferença entre o ggplot2 e outros sistemas de plotagem

A linguagem R possui um sistema gráfico robusto nativo (base R) e pacotes como lattice. Ainda assim, o ggplot2 se destaca pela flexibilidade gerada pelo conceito de camadas. A gramática dos gráficos permite que o usuário adapte o gráfico às suas necessidades, criando desde visualizações simples até muito complexas.


5.4 Construção de gráficos com ggplot2

A estrutura básica é:

ggplot(data = <DATA>) +
  <GEOM_FUNCTION>(mapping = aes(<MAPPINGS>)) +
  ...

A primeira camada (layer) necessária para a criação de gráficos no ggplot2 é dada pelo comando ggplot(dados). Neste comando, estamos criando a área onde o gráfico será construído e, ainda, informando ao ggplot2 qual o conjunto de dados que contém essas variáveis.

ggplot(data = df_2007)

Observe que aparece apenas uma área (em cinza) e é nesta àrea onde será construído o gráfico. Nela ainda não contém nenhum formato geométrico como, por exemplo, pontos, barras, caixas, etc. Para isso precisa-se informar ao ggplot2 qual o formato geométrico (geom_tipo) que será usado no gráfico. Além disso, precisa informar também qual a estética (aes(x,y,cores, …)) que quer dar ao gráfico: variável do eixo x, variável do eixo y, cores, etc. O operador + conecta as camadas do gráfico.

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

As variáveis significam: disp cilindradas e mpg significa milhas por galão.

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

Observe que no gráfico não foi ainda definida cor para os pontos, e também os eixos não foram rotulados. Agora propondo modificações, como definir uma cor fixa, aumentento dos pontos e adicionar transparência (alpha) e rotulos para os eixos.

ggplot(mtcars) +
  geom_point(mapping = aes(x= disp, y=mpg), color=c("red"))

ggplot(mtcars) +
  geom_point(mapping = aes(x= disp, y=mpg), color=c("red"))+
  labs(x="Cilindradas", y="Milhas/galão")

ggplot(mtcars) +
  geom_point(mapping = aes(x= disp, y=mpg), color=c("red"), alpha =0.2)+
  labs(x="Cilindradas", y="Milhas/galão")

ggplot(mtcars) +
  geom_point(mapping = aes(x= disp, y=mpg, color=as.factor(am), shape = as.factor(am)), size = 5) +
  labs(x="Cilindradas", y="Milhas/galão")

ggplot(mtcars) +
  geom_point(mapping = aes(x= disp, y=mpg, color=as.factor(am)), shape = "\U0001F694", size = 5) +
  labs(x="Cilindradas", y="Milhas/galão")

ggplot(mtcars) +
  geom_point(mapping = aes(x= disp, y=mpg, color=as.factor(am)), shape = "\U0001F694", size = 5) +
  labs(x="Cilindradas", y="Milhas/galão", color = 'População')

Com esse tipo de modificações o gráfico fica visualmente mais informativo e agradável, mantendo a mesma estrutura da gramática dos gráficos já apresentada.

5.4.1 Mapeamento Estético (aes())

Nesta seção mostramos como o mapeamento estético aes() conecta variáveis as propriedades visuais do gráfico. Os exemplos ilustram o uso global e local de mapeamentos, além da aplicação de múltiplas estéticas simultaneamente.

  • posição (x, y)
  • cor (color)
  • tamanho (size)
  • preenchimento (fill)
  • transparência (alpha)
  • texto (label)

Regras importantes:

  • Mapeamento definido em ggplot() → global.
  • Mapeamento definido em um geom_() → local.
  • Valores constantes devem ser definidos fora do aes().

Exemplo 1: — Dispersão colorida por continente

g <- ggplot(df_2007) +
  geom_point(aes(x = log_gdp_per_capita,
                 y = life_expec,
                 color = continent),
             size = 3)
g

O que está sendo feito:

Foi criado um gráfico de dispersão relacionando a variável log_gdp_per_capita e life_expec.

A cor dos pontos representa os continentes, graças ao mapeamento estético dentro de `aes(color = continent).

Como o aes() está no geom_point(), o mapeamento é local, afetando apenas essa camada.

O tamanho (size = 3) é um valor constante → portanto fica fora do aes().

Exemplo 2: — Dispersão com tamanho representando o PIB per capita

g <- ggplot(df_2007) +
  geom_point(aes(x = log_gdp_per_capita,
                 y = life_expec,
                 color = continent,
                 size = gdpPercap))
g

O que está sendo feito:

  • Mantém-se o mesmo gráfico do exemplo anterior, mas agora:

    • O tamanho do ponto varia conforme o PIB per capita real (gdpPercap).

    • O size está dentro do aes(), pois é mapeado a uma variável (não é constante).

  • Esse gráfico é um bolha colorida, pois varia cor e tamanho simultaneamente.


5.5 Exemplos de Geometrias

A tabela apresentada resume os principais tipos de geometrias e seus usos.

Tipo de Gráfico Geometria Uso
Dispersão geom_point() Relações entre variáveis numéricas
Barras geom_col(), geom_bar() Comparações de categorias
Linhas geom_line() Séries temporais
Histograma geom_histogram() Distribuição
Boxplot geom_boxplot() Distribuição via quantis
Texto geom_text() / geom_label() Anotações

5.5.1 Gráfico de Dispersão/Bolhas

O geom_point() é utilizado para criar gráficos de dispersão, ideais para visualizar relações entre duas variáveis numéricas. Ele também permite representar categorias, intensidade, magnitude e agrupamentos usando cor, forma e tamanho.

Argumento Uso / Descrição Exemplo
color / colour Cor do ponto (contorno para shapes 21–25) color = "blue"
fill Cor interna do ponto (somente para shapes 21–25) fill = "white"
shape Forma do ponto (0–25) shape = 16
size Tamanho do ponto size = 3
alpha Transparência do ponto (0–1) alpha = 0.6
stroke Espessura da borda do ponto (shapes 21–25) stroke = 1
position Ajuste de posição ("identity", "jitter" ou position_jitter()) position = "jitter"
na.rm Remove valores ausentes sem avisos (TRUE/FALSE) na.rm = TRUE
stat Estatística aplicada (default "identity") stat = "identity"
mapping Estética local (útil para sobrepor camadas com mapeamentos diferentes) mapping = aes(color = z)
orientation Orientação dos eixos (geralmente detectada automaticamente) orientation = "x"

ggplot(df_2007) +
  geom_point(aes(x = log_gdp_per_capita,
             y = life_expec,
             size = populacao)) +
  labs(title = "Renda per Capita vs. Expectativa de Vida")

O que está sendo feito:

  • Cada ponto representa um país no ano de 2007.

  • Eixo X: renda per capita (log).

  • Eixo Y: expectativa de vida.

  • Tamanho da bolha: população total do país.

  • O gráfico permite identificar países muito populosos e os relacionar com saúde e renda.

5.5.2 Gráfico de Barras

O geom_col() é usado quando você já possui os valores numéricos que representam a altura das barras (diferente de geom_bar(), que calcula contagens automaticamente). Ele permite visualizar comparações entre categorias, proporções ou valores agregados.

Argumento Uso / Descrição Exemplo
fill Cor interna das barras fill = "steelblue"
color / colour Cor das bordas das barras color = "black"
alpha Transparência das barras (0–1) alpha = 0.7
width Largura das barras (0 a 1) width = 0.8
linewidth / size Espessura da linha de contorno size = 0.5
position Modo de disposição das barras (stack, dodge, fill) position = "dodge"
stat Estatística usada (default "identity", que usa y diretamente) stat = "identity"
orientation Orientação da barra ("x" ou "y") orientation = "y"
df_feliz %>%
  group_by(continent) %>%
  summarise(pop_total = sum(populacao)) %>%
  ggplot() +
  geom_col(aes(x = continent, y = pop_total))

O que está sendo feito:

  • A população total é somada por continente.

    • geom_col() plota barras onde:

    • O eixo X contém continentes.

    • O eixo Y contém a população agregada.

  • Como a altura da barra já está nos dados, usamos geom_col() e não geom_bar().

5.5.3 Gráfico boxplot

O geom_boxplot é a função do ggplot2 usada para criar boxplots, permitindo visualizar a distribuição de uma variável por meio de seus quartis, mediana e possíveis outliers.

Argumento Uso / Descrição Exemplo
width Controla a largura dos boxplots width = 0.6
fill Cor interna da caixa fill = "lightblue"
color Cor das bordas color = "black"
alpha Transparência do boxplot (0–1) alpha = 0.7
size / lwd Espessura das linhas do boxplot size = 0.5
varwidth Largura proporcional ao tamanho do grupo varwidth = TRUE
outlier.colour Cor dos outliers outlier.colour = "red"
outlier.size Tamanho dos outliers outlier.size = 2
outlier.shape Formato dos outliers outlier.shape = 19

ggplot(mtcars) +
  geom_boxplot(aes(x = as.factor(cyl), y = mpg)) +
  labs(x = "Número de cilindros", y = "Milhas/galão")

ggplot(mtcars) +
  geom_boxplot(aes(x = as.factor(cyl), y = mpg, colour=as.factor(cyl))) +
  labs(x = "Número de cilindros", y = "Milhas/galão")


ggplot(mtcars) +
  geom_boxplot(aes(x = as.factor(cyl), y = mpg, fill=as.factor(cyl), 
                   colour=as.factor(cyl))) +
  labs(x = "Número de cilindros", y = "Milhas/galão")


ggplot(mtcars) +
geom_boxplot(
  aes(x = as.factor(cyl), 
      y = mpg, colour=as.factor(cyl)),
  width = 0.6,               # largura do boxplot
  varwidth = FALSE,          # TRUE = largura proporcional ao tamanho do grupo
  fill = "lightblue",        # cor interna
  color = "black",           # cor das bordas
  alpha = 0.7,               # transparência
  size = 0.5,                # espessura das linhas
  outlier.colour = "red",    # cor dos outliers
  outlier.size = 2,          # tamanho dos outliers
  outlier.shape = 19         # tipo de ponto para outliers
)+
labs(x = "Número de cilindros", y = "Milhas/galão")  


5.5.4 Gráfico histograma

O geom_histogram() é a geometria do ggplot2 usada para construir histogramas, permitindo visualizar a distribuição de uma variável numérica por meio de contagens dentro de intervalos (bins).

A seguir, são apresentados os principais parâmetros da função.

Argumento Uso / Descrição Exemplo
bins Número de barras do histograma bins = 30
binwidth Largura dos intervalos (define o tamanho de cada barra) binwidth = 1
fill Cor interna das barras fill = "steelblue"
color Cor das bordas das barras color = "black"
alpha Transparência das barras (0–1) alpha = 0.7
boundary Valor onde começa a ancoragem dos bins boundary = 0
closed Define intervalo fechado em "right" ou "left" closed = "left"
position Ajuste em gráficos sobrepostos ("identity", "stack", "dodge") position = "identity"
na.rm Remove NA sem aviso na.rm = TRUE

Exemplos:

 ggplot(mtcars) +
  geom_histogram(aes(x = mpg), fill = "red")+
  labs(x = "Milhas/galão", y = "Frequência absoluta")

 ggplot(mtcars) +
  geom_histogram(aes(x = mpg), fill = "red",
                 bins=5, colour="brown", alpha=0.2, position = "dodge")+
  labs(x = "Milhas/galão", y = "Frequência absoluta")


5.5.5 Gráfico barras

O geom_bar() é a geometria do ggplot2 usada para criar gráficos de barras baseados em contagens de uma variável categórica, geradas automaticamente pelo próprio ggplot2. A seguir, são apresentados os principais parâmetros da função.

Argumento Uso / Descrição Exemplo
stat Define a estatística usada; padrão é "count" stat = "count"
position Ajuste de posicionamento: "stack", "dodge", "fill", "identity" position = "dodge"
fill Cor interna das barras fill = "skyblue"
color Cor da borda das barras color = "black"
alpha Transparência das barras (0–1) alpha = 0.8
width Largura das barras width = 0.7
na.rm Remove NAs sem gerar aviso na.rm = TRUE
linewidth Espessura da borda das barras linewidth = 0.5
orientation Orientação: "x" ou "y" (geralmente automático) orientation = "x"
ggplot(mtcars) +
  geom_bar(aes(x = factor(am)))


5.6 Modificações em Gráficos

5.6.1 A. Geometrias Extras

O geom_smooth() é usado para adicionar linhas de tendência ou curvas suavizadas em gráficos, ajudando a identificar padrões, relações e tendências entre variáveis. Ele suporta modelos lineares, loess, GAM e outros métodos de ajuste.

Argumento Uso / Descrição Exemplo
method Método de ajuste: "lm" (linear), "loess", "gam", "glm", etc. method = "lm"
formula Fórmula para o modelo (p.ex. y ~ x, y ~ poly(x,2)) formula = y ~ x
se Exibe intervalo de confiança (TRUE/FALSE) se = FALSE
level Nível do intervalo de confiança (default 0.95) level = 0.90
span Grau de suavização no loess (0–1) span = 0.8
color / colour Cor da linha da suavização color = "red"
fill Cor da banda de confiança fill = "pink"
linetype Tipo da linha (1–6) linetype = 2
linewidth / size Espessura da linha linewidth = 1
method.args Argumentos adicionais para o método method.args = list(family="gaussian")
formula Fórmula do modelo a ser ajustado formula = y ~ poly(x,2)
position Ajuste de posição (raro em smooths, normalmente "identity") position = "identity"
na.rm Remove valores ausentes sem avisos na.rm = TRUE
orientation Orientação (detectada automaticamente) orientation = "x"

ggplot(df_2007, aes(x = log_gdp_per_capita, y = life_expec)) +
  geom_point() +
  geom_smooth(method = "lm")

5.6.2 Modificação de Escalas

data(iris)
head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa

5.6.3 Função scale_color_manual()

A função scale_color_manual() permite definir cores personalizadas para variáveis mapeadas à estética color no ggplot2. É especialmente útil quando se deseja controlar exatamente as cores atribuídas a cada categoria.

Argumento Uso / Descrição Exemplo
values Vetor de cores atribuídas às categorias values = c("A" = "red", "B" = "blue")
name Título da legenda name = "Grupo"
labels Rótulos personalizados das categorias labels = c("A" = "Tipo A", "B" = "Tipo B")
breaks Ordem e seleção das categorias na legenda breaks = c("B","A")
limits Define categorias exibidas (inclusive ocultando algumas) limits = c("A","B","C")
na.value Cor atribuída a valores ausentes na.value = "grey80"
guide Tipo de legenda ("legend", "none", etc.) guide = "legend"
drop Remove níveis não utilizados (TRUE/FALSE) drop = FALSE
aesthetics Define quais estéticas a escala afeta (geralmente "colour" apenas) aesthetics = "colour"
ggplot(iris, aes(Petal.Length, Petal.Width, color = Species)) +
  geom_point() +
  scale_color_manual(values = c("orange", "black", "red"))

ggplot(iris, aes(Petal.Length, Petal.Width, color = Species)) +
  geom_point() +
  scale_color_manual(values = c("orange", "black", "red"),
                     name = "Especie",
                     labels = c("Setosa", "Versicolor","Virginica"))

5.6.4 Facetas

No ggplot2, facetas (facets) é uma forma de dividir um gráfico em vários subgráficos menores, cada um mostrando uma parte dos dados segundo uma variável categórica ou contínua discretizada.

Elas funcionam como “painéis” que permitem comparar grupos lado a lado, mantendo a mesma escala e estética.

Por que usar facetas?

  • Comparar padrões entre grupos

  • Facilitar a visualização de interações

  • Evitar sobreposição de muitos elementos em um único gráfico

  • Criar painéis organizados automaticamente

Exemplos:

5.6.4.1 Facetas com facet_wrap()

A função facet_wrap() divide o gráfico em várias janelas (painéis), cada uma representando um subconjunto dos dados. É usada para comparar grupos categóricos lado a lado, preservando a mesma estrutura gráfica.

Argumento Uso / Descrição Exemplo
facets Variável (ou interação de variáveis) usada para dividir os painéis ~ continente
nrow Número de linhas dos painéis nrow = 2
ncol Número de colunas dos painéis ncol = 3
scales Controle das escalas ("fixed", "free", "free_x", "free_y") scales = "free_y"
shrink Ajusta limites das escalas conforme o conteúdo de cada painel shrink = TRUE
dir Direção da organização dos painéis ("h" = horizontal, "v" = vertical) dir = "h"
strip.position Posicionamento das tiras de rótulos (top, bottom, left, right) strip.position = "top"
labeller Personaliza rótulos dos painéis labeller = label_both
drop Remove níveis não usados do fator drop = FALSE
ggplot(df_2007, aes(log_gdp_per_capita, life_expec)) +
  geom_point() +
  facet_wrap(vars(continent))

5.6.4.2 Facetas bidimensionais com facet_grid()

A função facet_grid() organiza os gráficos em uma grade bidimensional (linhas × colunas), permitindo comparar duas variáveis categóricas simultaneamente — uma nas linhas e outra nas colunas.

Argumento Uso / Descrição Exemplo
rows / cols Variáveis definidas para linhas e colunas (geralmente com a sintaxe var1 ~ var2) facet_grid(sexo ~ continente)
scales Escalas dos eixos: "fixed", "free", "free_x", "free_y" scales = "free_y"
space Espaço entre painéis ao usar escalas livres: "fixed" ou "free" space = "free_y"
shrink Ajusta limites da escala conforme cada painel shrink = TRUE
labeller Personalização dos rótulos (ex.: label_both, label_value, label_wrap_gen) labeller = label_both
drop Remove níveis de fatores não usados drop = FALSE
switch Troca posição dos rótulos das facetas para "x" ou "y" switch = "x"
as.table Organiza painéis de cima para baixo (TRUE, padrão) ou de baixo para cima (FALSE) as.table = FALSE
ggplot(mpg, aes(displ, hwy)) +
  geom_point()+
  facet_grid(drv ~ fl)

5.6.4.2.1 Sintaxe geral
facet_grid(linhas ~ colunas)
  • Se você quer somente linhas: facet_grid(var ~ .)
  • Se você quer somente colunas: facet_grid(. ~ var)

5.6.4.2.2 Exemplo básico
ggplot(df_2007, aes(x = life_expec, y = gdpPercap)) +
  geom_point() +
  facet_grid(continent ~ .)

5.6.4.2.3 Exemplo 2D com duas variáveis
ggplot(df_2007, aes(x = life_expec, y = log_gdp_per_capita)) +
  geom_point(alpha = 0.7) +
  facet_grid(continent ~ year)

5.6.4.2.4 Exemplo com escalas livres
ggplot(df_2007, aes(x = life_expec, y = populacao)) +
  geom_point() +
  facet_grid(continent ~ year, scales = "free_y")

5.6.5 Temas e Rótulos

No ggplot2, “rótulos” (labels) são usados para dar nomes e explicações ao gráfico, enquanto “temas” (themes) servem para estilizar a parte visual (cores, fontes, fundo, linhas, textos).

  • Parâmetros para função themes

O theme() é a função do ggplot2 responsável por controlar todos os aspectos visuais e estéticos do gráfico, como textos, fundos, grades, legendas, margens e rótulos das facetas. A seguir, são apresentados os principais elementos que podem ser ajustados dentro da função.

Elemento Uso / Descrição Exemplo
plot.title Estiliza o título do gráfico element_text(size = 16)
plot.subtitle Estiliza o subtítulo element_text(color = "gray40")
plot.caption Estiliza a legenda/fonte do gráfico element_text(size = 9)
axis.title.x Texto do título do eixo X element_text(face = "bold")
axis.title.y Texto do título do eixo Y element_text(face = "bold")
axis.text.x Texto dos marcadores do eixo X element_text(size = 10)
axis.text.y Texto dos marcadores do eixo Y element_text(size = 10)
legend.title Título da legenda element_text(face = "bold")
legend.text Texto dos itens da legenda element_text(size = 10)
legend.position Posição da legenda ("right", "left", "top", "bottom") "right"
panel.background Fundo da área do gráfico element_rect(fill = "white")
panel.grid Controla todas as grades element_line(color = "gray90")
panel.grid.major Linhas principais da grade element_line()
panel.grid.minor Linhas secundárias da grade element_blank()
strip.text Texto nos cabeçalhos das facetas element_text(face = "bold")
strip.background Fundo dos cabeçalhos das facetas element_rect(fill = "gray90")
plot.margin Margens externas do gráfico margin(10, 10, 10, 10)
p <- ggplot(df_2007, aes(x = log_gdp_per_capita, y = life_expec)) +
  geom_point() +
  theme(panel.background = element_rect(fill = "gray95"),
        axis.title = element_text(size = 14))
p

q <- ggplot(df_2007, aes(x = log_gdp_per_capita, y = life_expec)) +
  geom_point() +
  theme(panel.background = element_rect(fill = "white"),
        axis.title = element_text(size = 14))
q

p+
theme(
  # ----- TÍTULOS E TEXTOS DO GRÁFICO -----
  plot.title    = element_text(size = 16, face = "bold"),
  plot.subtitle = element_text(size = 12),
  plot.caption  = element_text(size = 10, color = "gray40"),

  # ----- TÍTULOS E TEXTOS DOS EIXOS -----
  axis.title.x = element_text(size = 12, face = "bold"),
  axis.title.y = element_text(size = 12, face = "bold"),
  axis.text.x  = element_text(size = 10),
  axis.text.y  = element_text(size = 10),

  # ----- LEGENDA -----
  legend.title    = element_text(face = "bold"),
  legend.text     = element_text(),
  legend.position = "right",    # "left", "bottom", "top", "none"

  # ----- PAINEL (ÁREA DO GRÁFICO) -----
  panel.background = element_rect(fill = "white"),
  panel.grid.major = element_line(color = "gray90"),
  panel.grid.minor = element_blank(),

  # ----- TÍTULOS DAS FACETAS -----
  strip.text = element_text(face = "bold"),
  strip.background = element_rect(fill = "gray90"),

  # ----- MARGENS -----
  plot.margin = margin(10, 10, 10, 10)
)

  • Parâmetros para função labs

A função labs() no ggplot2 é utilizada para definir ou alterar os rótulos textuais do gráfico, como título, subtítulo, nomes dos eixos, legendas e notas de rodapé. A seguir, são apresentados os principais argumentos da função para configuração de rótulos.

Argumento Uso / Descrição Exemplo
title Define o título principal do gráfico title = "Título do gráfico"
subtitle Define o subtítulo subtitle = "Um subtítulo opcional"
x Nome do eixo X x = "Eixo X"
y Nome do eixo Y y = "Eixo Y"
caption Texto da fonte/nota do gráfico caption = "Fonte: Dados XYZ"
color Título da legenda de cores color = "Grupo"
fill Título da legenda de preenchimento fill = "Categoria"
shape Título da legenda de formato de pontos shape = "Tipo"
linetype Título da legenda de tipo de linha linetype = "Linha"
size Título da legenda de tamanho size = "Tamanho"
p + labs(
  x = "Log do PIB per capita",
  y = "Expectativa de vida (anos)",
  title = "PIB per capita e Expectativa de Vida"
)

ggplot(mpg, aes(displ, hwy, color = class, shape = drv, size = cyl)) +
  geom_point(alpha = 0.7) +
  labs(
    title = "Relação entre Cilindrada e Consumo",
    subtitle = "Exemplo usando múltiplos parâmetros de labs()",
    x = "Cilindrada (L)",
    y = "Consumo em rodovia (mpg)",
    caption = "Fonte: Base mpg do pacote ggplot2",
    color = "Classe do veículo",
    shape = "Tipo de tração",
    size = "Número de cilindros"
  ) 


5.7 Uma Metáfora Útil

Pense no ggplot2 como um sanduíche gourmet:

  • ggplot() = o pão: define base (dados) e regras globais (aes()).
  • Cada geom_ = um ingrediente (uma camada).
  • aes() local = instrução específica para um ingrediente.
  • + = junta tudo.
  • scale_ e theme_ = o molho e a embalagem final.