Gráficos de Barras Comparam Categorias
Um gráfico de barras responde "quanto de cada?" - uma barra por categoria, com o comprimento da barra mostrando o valor da categoria. No R a função base é barplot(), e sua entrada é simplesmente um vetor de alturas. Dê nomes ao vetor e os nomes viram os rótulos sob as barras:
visits <- c(Mon = 42, Tue = 51, Wed = 47, Thu = 60, Fri = 78)
barplot(visits,
main = "Store visits by day",
ylab = "Visits")
Cinco barras cinzas, rotuladas por dia, subindo de uma segunda-feira modesta a um pico na sexta quase duas vezes mais alto. Nada para instalar, nada para configurar - se você consegue construir um vetor nomeado, consegue plotá-lo.
Os editores executáveis desta página mostram apenas saída de texto, então as chamadas a barplot() aqui são trechos estáticos para colar em uma sessão R local - mas o passo de contagem antes delas roda normalmente, e é esse o passo que mais importa.
O Fluxo Real: table() Primeiro, barplot() Depois
Na prática você raramente tem alturas arrumadas e pré-contadas. Você tem uma coluna bruta de rótulos de categoria - uma linha por resposta de pesquisa, por pedido, por usuário - e a contagem é o trabalho de verdade. table() faz isso em uma chamada, e sua saída é um vetor nomeado de contagens, que é exatamente o que barplot() quer:
Aí o gráfico é mais uma linha:
barplot(sort(t, decreasing = TRUE),
main = "Survey responses",
ylab = "Count")
Esse par de passos - table() e então barplot() - é de longe o fluxo de gráfico de barras mais comum no R. Ordenar a tabela antes é uma melhoria barata: barras ordenadas por altura se leem mais rápido que barras em ordem alfabética, a menos que as categorias tenham uma ordem natural (dias, meses, níveis de dose) - caso em que um fator com níveis ordenados corretamente impede o table() de alfabetizá-las. Para barras que exigem agregação de verdade - somas ou médias por grupo em vez de contagens de linhas - faça o passo de agrupar e resumir antes e entregue o resultado ao barplot().
Rótulos e Estilo
Os rótulos normalmente vêm dos nomes do vetor, mas names.arg os sobrescreve - útil quando os códigos dos dados não são adequados para um público:
barplot(visits,
names.arg = c("Monday", "Tuesday", "Wednesday",
"Thursday", "Friday"),
col = "steelblue",
border = NA,
main = "Store visits by day",
las = 2)
colpreenche as barras; passe um vetor para colorir cada barra individualmente, mas resista ao arco-íris por padrão - a cor deve significar algo, como destacar a única barra sobre a qual você está falando.border = NAremove os contornos das barras para um visual mais limpo.las = 2gira os rótulos dos eixos perpendicularmente ao eixo - a solução para nomes de categoria longos que se sobrepõem. Combine com uma margem inferior maior (par(mar = c(8, 4, 4, 2))) se os nomes forem realmente longos.
Barras Agrupadas e Empilhadas a Partir de uma Matriz
Para mostrar duas dimensões categóricas ao mesmo tempo - digamos, vendas por canal por trimestre - entregue uma matriz ao barplot(). Cada coluna vira uma posição no eixo das categorias, e as linhas viram as sub-barras:
sales <- matrix(c(12, 18, 15, 22, 20, 19, 24, 27),
nrow = 2,
dimnames = list(c("Online", "Retail"),
c("Q1", "Q2", "Q3", "Q4")))
# Grouped: rows stand next to each other within each quarter
barplot(sales, beside = TRUE,
col = c("steelblue", "orange"),
legend.text = rownames(sales),
main = "Sales by channel and quarter")
# Stacked: rows pile up into one total bar per quarter (the default)
barplot(sales, beside = FALSE,
col = c("steelblue", "orange"),
legend.text = rownames(sales))
beside = TRUE põe os dois canais ombro a ombro dentro de cada trimestre - o melhor quando você quer comparar os canais diretamente. O padrão empilhado enfatiza o total por trimestre, com a divisão mostrada dentro de cada barra; ele é honesto para totais, mas dificulta comparar os segmentos internos entre barras, já que as linhas de base deles se deslocam. legend.text = rownames(sales) adiciona a legenda que torna qualquer uma das versões legível.
Mais um interruptor: horiz = TRUE deita as barras ao longo do eixo horizontal. É o layout mais gentil para muitas categorias com nomes longos - cada rótulo fica em sua própria linha ao lado da barra, sem rotação.
Gráfico de Barras ou Histograma?
Quem pesquisa confunde os dois o tempo todo, e a distinção vale trinta segundos: um gráfico de barras compara categorias distintas - o eixo é um conjunto de rótulos, as barras são separadas, e reordená-las é legítimo. Um histograma agrupa uma variável numérica em faixas - o eixo é uma escala contínua, as barras se tocam porque as faixas são intervalos consecutivos, e reordená-las seria um absurdo. Se sua coluna contém palavras ("Yes", "Chrome", "Q3"), você quer barplot(table(x)). Se contém medições (alturas, preços, tempos de resposta), você quer o histograma e hist(x).
ggplot2: geom_col vs geom_bar
A versão do ggplot2 vem em dois geoms, separados por se a contagem já foi feita ou não:
library(ggplot2)
# geom_bar(): raw observations in, counting done for you
ggplot(survey, aes(x = response)) +
geom_bar(fill = "steelblue")
# geom_col(): heights already computed, one row per bar
totals <- data.frame(day = c("Mon", "Tue", "Wed", "Thu", "Fri"),
visits = c(42, 51, 47, 60, 78))
ggplot(totals, aes(x = day, y = visits)) +
geom_col(fill = "steelblue")
geom_bar() é o table() embutido no gráfico: ele recebe uma linha por observação e soma. geom_col() recebe dados pré-agregados e mapeia uma coluna y para a altura da barra - o equivalente ao barplot() clássico. Alimentar geom_bar() com dados já contados é a armadilha padrão do iniciante: ele conta as linhas (uma cada) e todas as barras saem com a mesma altura.
O Que Você Leva Daqui
barplot(alturas)plota um vetor nomeado - etable(x)produz exatamente esse formato a partir de dados categóricos brutos, entãobarplot(table(x))é o idioma central.- Ordene a tabela (ou defina os níveis do fator) antes de plotar; a ordem das barras faz parte da mensagem.
- Uma matriz gera barras agrupadas (
beside = TRUE) ou empilhadas (padrão); acrescentelegend.text = rownames(m). names.arg,col,las = 2ehoriz = TRUEcuidam da rotulagem; barras horizontais são melhores para nomes longos.- Categorias → gráfico de barras; faixas numéricas → histograma. No ggplot2: linhas brutas →
geom_bar(), alturas calculadas →geom_col().
A seguir: o próprio ggplot2 - a gramática que constrói todos esses gráficos, e muitos outros, a partir das mesmas poucas peças combináveis.
Perguntas frequentes
Como fazer um gráfico de barras no R?
Chame barplot() em um vetor de alturas. Dê nomes ao vetor - ou construa-o com table(), cuja saída já vem nomeada - e cada elemento vira uma barra rotulada: barplot(table(df$category)).
Como fazer um gráfico de barras agrupado ou empilhado no R?
Passe uma matriz. Cada coluna vira uma posição no eixo das categorias; beside = TRUE desenha as linhas como barras lado a lado (agrupadas), enquanto o padrão beside = FALSE as empilha. Acrescente legend.text = rownames(m) para que quem lê consiga distinguir as linhas.
Qual é a diferença entre barplot() e hist() no R?
barplot() compara categorias distintas - uma barra por categoria, barras separadas. hist() agrupa uma variável numérica em intervalos consecutivos - as barras se tocam porque o eixo é uma escala contínua. Se sua variável tem palavras, você quer barplot(table(x)); se tem números, você quer hist(x).
Devo usar geom_bar ou geom_col no ggplot2?
geom_bar() conta por você - dê a ele observações brutas e ele soma cada categoria. geom_col() plota valores que você já calculou - dê a ele uma linha por barra mais uma coluna de altura. Dados já contados com geom_bar() é o erro clássico; eles pedem geom_col().