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:
- Dados - qual data frame?
ggplot(mtcars, ...) - Mapeamento - quais colunas controlam quais propriedades visuais?
aes(x = wt, y = hp) - 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ãomtcars. 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 colunawt, a posição vertical dehp. Note que você escreve os nomes das colunas diretamente, nãomtcars$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").