Menu

Gráfico de Barras no R: barplot() a Partir de Contagens e Tabelas

Como fazer um gráfico de barras no R com barplot() - a partir de um vetor nomeado ou de um table(), barras agrupadas e empilhadas a partir de uma matriz, estilização e geom_col vs geom_bar.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

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)
  • col preenche 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 = NA remove os contornos das barras para um visual mais limpo.
  • las = 2 gira 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 - e table(x) produz exatamente esse formato a partir de dados categóricos brutos, então barplot(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); acrescente legend.text = rownames(m).
  • names.arg, col, las = 2 e horiz = TRUE cuidam 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().

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR