Menu

ggplot2 no R: Um Guia para Iniciantes da Gramática dos Gráficos

Como o ggplot2 funciona - o modelo mental dados + aes() + geom, mapear vs definir estéticas, labs(), facet_wrap(), temas e como salvar gráficos com ggsave().

O ggplot2 Constrói Gráficos a partir de Camadas

O ggplot2 é o pacote de gráficos mais usado do R, e o motivo pelo qual as pessoas o defendem com unhas e dentes é uma ideia de design: a gramática dos gráficos. O R base oferece uma função por gráfico - plot(), hist(), barplot() - cada uma com seus próprios argumentos. O ggplot2, em vez disso, oferece um pequeno conjunto de peças componíveis - um conjunto de dados, um mapeamento de colunas para propriedades visuais e camadas de desenho - que se combinam com + para formar qualquer gráfico. Aprenda a gramática uma vez e todo novo tipo de gráfico vira a mesma frase com uma palavra trocada. Como bônus, os padrões (painel cinza, eixos sensatos, legendas automáticas) ficam apresentáveis sem nenhum esforço de estilização.

Ele é um pacote adicional, então precisa de uma instalação única e de um carregamento por sessão:

install.packages("ggplot2")   # once, on your machine
library(ggplot2)              # at the top of every script that uses it

Uma expectativa que vale conhecer desde já: o ggplot2 quer um data frame (não vetores soltos), idealmente no formato longo e tidy - uma linha por observação, uma coluna por variável. Se seus dados estão no formato largo, pivotá-los para o formato longo primeiro geralmente dissolve o que parecia ser um problema de plotagem.

O Modelo Mental: Dados, Mapeamento, Geometria

Todo ggplot responde a três perguntas, uma por parte:

  1. Dados - qual data frame? ggplot(mtcars, ...)
  2. Mapeamento - quais colunas controlam quais propriedades visuais? aes(x = wt, y = hp)
  3. Geometria - como as observações devem ser desenhadas? + geom_point()

Aqui está a anatomia, token por token:

ggplot(mtcars, aes(x = wt, y = hp)) +
    geom_point()
  • ggplot(mtcars, ...) inicia um gráfico cujos dados padrão são mtcars. Sozinho, ele desenha um painel cinza vazio - ainda sem camadas.
  • aes(x = wt, y = hp) é o mapeamento estético: a posição horizontal vem da coluna wt, a posição vertical de hp. Note que você escreve os nomes das colunas diretamente, não mtcars$wt - o mapeamento é avaliado dentro dos dados que você forneceu.
  • + geom_point() adiciona uma camada que desenha cada linha como um ponto. O + é realmente uma soma de camadas: o gráfico é um objeto que você vai construindo, e você pode continuar adicionando - outro geom, rótulos, um tema - cada um com outro +.

Execute e você obtém o mesmo gráfico de dispersão de peso vs potência da versão em R base do guia de gráficos de dispersão, sobre um painel cinza com linhas de grade brancas. Troque geom_point() por geom_line() e o mesmo mapeamento vira um gráfico de linhas - é a gramática fazendo seu trabalho.

Os Geoms Que Você Vai Usar de Verdade

Uma dúzia de geoms cobre quase todo o trabalho do dia a dia:

geom_point()       # scatter plot: two numeric variables
geom_line()        # line chart: trends over an ordered variable
geom_col()         # bar chart from pre-computed heights (needs y)
geom_bar()         # bar chart that counts raw rows for you (no y)
geom_histogram()   # distribution of one numeric variable (set binwidth)
geom_boxplot()     # distributions compared across groups
geom_smooth()      # fitted trend line; method = "lm" for straight

As camadas se empilham, e é aí que o ggplot2 começa a superar o R base em expressividade: geom_point() + geom_smooth(method = "lm") é um gráfico de dispersão com uma linha de regressão e uma banda de confiança, em uma linha legível. Como os gráficos são objetos, você também pode salvar uma base e ramificar a partir dela:

p <- ggplot(mtcars, aes(x = wt, y = hp)) + geom_point()

p + geom_smooth(method = "lm")   # one variant
p + geom_smooth()                # another (loess curve)

Mapear vs Definir: a Clássica Confusão do aes()

O único erro que todo iniciante em ggplot2 comete, geralmente na primeira semana: colocar uma cor literal dentro de aes(). A regra é curta - dentro de aes() significa "varia com os dados"; fora significa "configuração fixa" - e os dois posicionamentos fazem coisas completamente diferentes:

# MAPPING: color varies by a column - each cylinder count gets its own
# color, and a legend appears automatically
ggplot(mtcars, aes(x = wt, y = hp, color = factor(cyl))) +
    geom_point(size = 2)

# SETTING: every point is literally steelblue - no legend, no mapping
ggplot(mtcars, aes(x = wt, y = hp)) +
    geom_point(color = "steelblue", size = 2)

E a armadilha em si:

# WRONG: "blue" inside aes() is treated as data, not as a color
ggplot(mtcars, aes(x = wt, y = hp, color = "blue")) +
    geom_point()

Isso desenha pontos rosa-salmão com uma legenda cuja única entrada tem o rótulo "blue". Por quê: aes() mapeia colunas para propriedades, então color = "blue" cria uma coluna falsa de uma categoria só, cujo valor é a palavra "blue" em toda parte, e o ggplot atribui a essa categoria sua primeira cor padrão - que por acaso é um salmão avermelhado. Se você queria dizer "pinte os pontos de azul", a cor vai fora do mapeamento: geom_point(color = "blue"). A mesma regra governa size, shape, fill e alpha. (Note também o factor(cyl) no exemplo de mapeamento: cyl é numérico, e envolvê-lo em factor() pede cores distintas por grupo em vez de um gradiente contínuo de cores.)

Rótulos, Facetas e Temas

labs() nomeia tudo em um só lugar - e um gráfico não está pronto até ter rótulos de verdade:

ggplot(mtcars, aes(x = wt, y = hp, color = factor(cyl))) +
    geom_point(size = 2) +
    labs(title = "Horsepower vs. weight",
         x     = "Weight (1000 lbs)",
         y     = "Horsepower",
         color = "Cylinders")

Facetas são o recurso mais celebrado do ggplot2: dividir um gráfico em pequenos múltiplos, um painel por grupo, com eixos compartilhados para que os painéis se comparem honestamente:

ggplot(mtcars, aes(x = wt, y = hp)) +
    geom_point() +
    facet_wrap(~ cyl)

Três painéis aparecem - um para carros de 4, 6 e 8 cilindros - dispostos em uma grade com o valor do grupo legendado acima de cada painel. No R base isso é um malabarismo de par(mfrow) com limites compartilhados manuais; aqui é uma linha. Facetar recompensa dados tidy, e é por isso que o ggplot2 combina tão naturalmente com um pipeline dplyr - filtre e resuma, depois envie o resultado direto para o ggplot().

Temas reestilizam a tinta que não é dado em uma chamada: + theme_minimal() (fundo branco limpo), + theme_bw(), + theme_classic() (apenas eixos, sem grade), ou o padrão cinza. Escolha um por projeto e mantenha a consistência - um relatório em que todas as figuras compartilham um tema é lido como um documento único, e não como um álbum de recortes.

Salvando com ggsave() - e Quando o R Base Ainda Basta

ggsave() grava o gráfico mais recente em disco, inferindo o formato pela extensão do arquivo:

ggsave("hp-vs-weight.png", width = 8, height = 5)          # last plot shown
ggsave("hp-vs-weight.pdf", plot = p, width = 8, height = 5) # a saved object

width e height são em polegadas por padrão; defina-os explicitamente, porque os tamanhos das fontes escalam com as dimensões da saída e os padrões raramente combinam com o destino da figura.

Quanto a quando vale a pena: para uma olhada de cinco segundos em uma variável durante uma análise, o plot() do R base e companhia exigem menos digitação e zero dependências - não há prêmio por usar ggplot2 em tudo. O ggplot2 se paga no momento em que uma figura envolve grupos, legendas, facetas ou uma audiência: a gramática escala para uma complexidade que a plotagem base só alcança com esforço.

O Que Você Leva

  • O ggplot2 compõe todo gráfico a partir de dados + mapeamento aes() + camadas geom, unidos por +; aprenda a gramática uma vez, reutilize-a para todo tipo de gráfico.
  • aes() mapeia colunas para propriedades visuais - nomes de colunas diretos, avaliados no seu data frame.
  • Dentro de aes() = varia com os dados (e ganha legenda); fora = configuração fixa. aes(color = "blue") é o bug clássico.
  • labs() para títulos, facet_wrap(~ group) para pequenos múltiplos, theme_minimal() e companhia para estilizar, ggsave() com dimensões explícitas para exportar.
  • Olhada rápida e solitária: R base. Grupos, facetas ou uma audiência: ggplot2.

Isso fecha o capítulo de plotagem - daqui, o próximo passo natural é a estatística descritiva, colocando números nas formas que esses gráficos revelam.

Perguntas frequentes

O que é o ggplot2 no R?

O ggplot2 é o pacote de gráficos mais popular do R. Em vez de uma função por tipo de gráfico, você compõe todo gráfico a partir das mesmas três peças - um data frame, um mapeamento aes() de colunas para propriedades visuais e uma ou mais camadas geom_*() - unidas com +. Ele faz parte do tidyverse.

Como instalar o ggplot2?

Execute install.packages("ggplot2") uma única vez e depois library(ggplot2) no topo de cada script que o utiliza. Instalar coloca o pacote na sua máquina; library() o carrega na sessão atual.

O que o aes() faz no ggplot2?

aes() mapeia colunas dos seus dados para propriedades visuais: aes(x = wt, y = hp, color = factor(cyl)) diz que a posição horizontal vem de wt, a posição vertical de hp e a cor dos pontos da contagem de cilindros. Tudo que está dentro de aes() varia com os dados; tudo que está fora é uma configuração fixa.

Por que meus pontos no ggplot não ficam na cor que eu pedi?

Você colocou a cor dentro de aes(): aes(color = "blue") não define uma cor, ele mapeia uma categoria inventada chamada "blue", então o ggplot escolhe sua própria cor padrão e adiciona uma legenda. Para definir uma cor literal, coloque-a fora do mapeamento: geom_point(color = "blue").

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR