Skip to content

Matplotlib Gráfico de Barras: Guia Completo do plt.bar() e plt.barh()

Updated on

Gráficos de barras são a forma mais comum de comparar quantidades entre categorias. Receita por trimestre, notas por aluno, contagens por status -- gráficos de barras tornam essas comparações instantaneamente legíveis. Mas criar gráficos de barras eficazes no Matplotlib requer mais do que uma simples chamada plt.bar(). Você precisa lidar com comparações agrupadas, composições empilhadas, layouts horizontais para rótulos longos e anotações adequadas que tornem os gráficos autoexplicativos.

Este guia cobre cada padrão de gráfico de barras que você precisará no Matplotlib, desde barras verticais básicas até configurações agrupadas e empilhadas avançadas.

📚

Gráfico de Barras Vertical Básico

import matplotlib.pyplot as plt
 
categories = ['Python', 'JavaScript', 'Java', 'C++', 'Go']
values = [35, 28, 22, 15, 12]
 
plt.figure(figsize=(8, 5))
plt.bar(categories, values, color='steelblue', edgecolor='black', linewidth=0.5)
plt.xlabel('Linguagem')
plt.ylabel('Pontuação de Popularidade')
plt.title('Popularidade das Linguagens de Programação')
plt.show()

Gráfico de Barras Horizontal com plt.barh()

Use barras horizontais quando os rótulos de categoria são longos ou quando você tem muitas categorias:

import matplotlib.pyplot as plt
 
frameworks = ['React', 'Vue.js', 'Angular', 'Svelte', 'Next.js',
              'Django', 'Flask', 'FastAPI', 'Express', 'Rails']
stars = [220, 207, 95, 78, 124, 78, 67, 74, 64, 55]
 
plt.figure(figsize=(10, 6))
plt.barh(frameworks, stars, color='#3498db', edgecolor='white')
plt.xlabel('Estrelas no GitHub (milhares)')
plt.title('Popularidade de Frameworks por Estrelas no GitHub')
plt.gca().invert_yaxis()  # Maior no topo
plt.tight_layout()
plt.show()

Personalização de Cores

import matplotlib.pyplot as plt
 
categories = ['Q1', 'Q2', 'Q3', 'Q4']
revenue = [120, 150, 180, 200]
 
# Cor diferente por barra
colors = ['#e74c3c', '#f39c12', '#2ecc71', '#3498db']
 
plt.figure(figsize=(8, 5))
bars = plt.bar(categories, revenue, color=colors, edgecolor='black', linewidth=0.5)
plt.ylabel('Receita ($K)')
plt.title('Receita Trimestral')
plt.show()

Adicionar Rótulos de Valor nas Barras

import matplotlib.pyplot as plt
 
categories = ['A', 'B', 'C', 'D', 'E']
values = [23, 45, 56, 78, 32]
 
plt.figure(figsize=(8, 5))
bars = plt.bar(categories, values, color='steelblue')
 
# Adicionar rótulos de valor acima de cada barra
for bar, val in zip(bars, values):
    plt.text(bar.get_x() + bar.get_width() / 2, bar.get_height() + 1,
             str(val), ha='center', va='bottom', fontsize=11)
 
plt.ylabel('Valor')
plt.title('Gráfico de Barras com Rótulos de Valor')
plt.show()

Gráfico de Barras Agrupado

Compare múltiplas séries lado a lado:

import matplotlib.pyplot as plt
import numpy as np
 
categories = ['Q1', 'Q2', 'Q3', 'Q4']
product_a = [20, 35, 30, 35]
product_b = [25, 32, 34, 20]
product_c = [15, 20, 25, 30]
 
x = np.arange(len(categories))
width = 0.25
 
plt.figure(figsize=(10, 6))
plt.bar(x - width, product_a, width, label='Produto A', color='#e74c3c')
plt.bar(x, product_b, width, label='Produto B', color='#3498db')
plt.bar(x + width, product_c, width, label='Produto C', color='#2ecc71')
 
plt.xlabel('Trimestre')
plt.ylabel('Vendas ($K)')
plt.title('Vendas Trimestrais por Produto')
plt.xticks(x, categories)
plt.legend()
plt.tight_layout()
plt.show()

Gráfico de Barras Empilhado

Mostre a composição de cada categoria:

import matplotlib.pyplot as plt
 
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
mobile = [30, 35, 40, 45]
desktop = [50, 45, 35, 30]
tablet = [20, 20, 25, 25]
 
plt.figure(figsize=(8, 6))
plt.bar(quarters, mobile, label='Mobile', color='#3498db')
plt.bar(quarters, desktop, bottom=mobile, label='Desktop', color='#e74c3c')
 
# Para a terceira pilha, calcular o fundo acumulado
import numpy as np
bottom_2 = np.array(mobile) + np.array(desktop)
plt.bar(quarters, tablet, bottom=bottom_2, label='Tablet', color='#2ecc71')
 
plt.ylabel('Tráfego (%)')
plt.title('Fontes de Tráfego por Trimestre')
plt.legend()
plt.show()

Barras de Erro

import matplotlib.pyplot as plt
import numpy as np
 
categories = ['Controle', 'Tratamento A', 'Tratamento B', 'Tratamento C']
means = [10.2, 15.8, 14.3, 18.1]
errors = [1.2, 2.1, 1.8, 2.5]
 
plt.figure(figsize=(8, 5))
plt.bar(categories, means, yerr=errors, capsize=5,
        color='steelblue', edgecolor='black', linewidth=0.5)
plt.ylabel('Valor de Resposta')
plt.title('Efeitos do Tratamento com Barras de Erro')
plt.show()

Referência de Parâmetros do plt.bar()

ParâmetroTipoDescrição
xtipo arrayPosições das barras (categorias)
heighttipo arrayAlturas das barras (valores)
widthfloatLargura da barra (padrão 0.8)
bottomtipo arrayCoordenada Y da base das barras (para empilhar)
colorcor ou arrayCor(es) de preenchimento das barras
edgecolorcorCor da borda das barras
linewidthfloatLargura da linha da borda
yerr / xerrtipo arrayTamanhos das barras de erro
capsizefloatLargura do remate das barras de erro
alignstrAlinhamento das barras ('center' ou 'edge')
labelstrRótulo da legenda
alphafloatTransparência (0-1)

Gráficos de Barras Interativos com PyGWalker

Para análise exploratória de dados, PyGWalker (opens in a new tab) permite criar gráficos de barras interativos arrastando e soltando colunas do seu DataFrame no Jupyter:

import pandas as pd
import pygwalker as pyg
 
df = pd.DataFrame({
    'Quarter': ['Q1', 'Q2', 'Q3', 'Q4'] * 3,
    'Product': ['A'] * 4 + ['B'] * 4 + ['C'] * 4,
    'Sales': [20, 35, 30, 35, 25, 32, 34, 20, 15, 20, 25, 30]
})
 
walker = pyg.walk(df)

FAQ

Como criar um gráfico de barras no Matplotlib?

Use plt.bar(categorias, valores) para barras verticais ou plt.barh(categorias, valores) para barras horizontais. Passe listas ou arrays para as categorias e seus valores correspondentes. Adicione plt.xlabel(), plt.ylabel() e plt.title() para rótulos.

Como criar um gráfico de barras agrupado?

Use np.arange() para posições x e desloque cada grupo pela largura da barra. Chame plt.bar() múltiplas vezes com posições x deslocadas: plt.bar(x - width, data1, width), plt.bar(x, data2, width), etc. Defina os rótulos do eixo com plt.xticks(x, categorias).

Como adicionar rótulos de valor acima das barras?

Itere sobre os objetos barra e use plt.text(). Para cada barra, calcule a posição x central com bar.get_x() + bar.get_width() / 2 e a posição y com bar.get_height(). Use ha='center' para alinhamento horizontal.

Como criar um gráfico de barras empilhado?

Use o parâmetro bottom em chamadas sucessivas a plt.bar(). A primeira chamada não tem bottom. A segunda chamada usa o primeiro conjunto de dados como bottom. Para uma terceira pilha, some os dois primeiros conjuntos de dados como bottom.

Quando devo usar gráficos de barras horizontais vs verticais?

Use barras horizontais (plt.barh()) quando os rótulos de categoria são longos, quando você tem muitas categorias (mais de 8-10), ou quando compara com uma linha de base. Use barras verticais (plt.bar()) para categorias de séries temporais (meses, trimestres) ou quando tem poucas categorias com rótulos curtos.

Conclusão

Os plt.bar() e plt.barh() do Matplotlib cobrem toda necessidade de gráficos de barras: comparações básicas, multi-séries agrupadas, composições empilhadas e apresentações anotadas. Para barras agrupadas, desloque posições x com np.arange(). Para barras empilhadas, use o parâmetro bottom. Sempre adicione rótulos de valor para clareza e escolha o layout horizontal quando os rótulos forem longos.

📚