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âmetro | Tipo | Descrição |
|---|---|---|
x | tipo array | Posições das barras (categorias) |
height | tipo array | Alturas das barras (valores) |
width | float | Largura da barra (padrão 0.8) |
bottom | tipo array | Coordenada Y da base das barras (para empilhar) |
color | cor ou array | Cor(es) de preenchimento das barras |
edgecolor | cor | Cor da borda das barras |
linewidth | float | Largura da linha da borda |
yerr / xerr | tipo array | Tamanhos das barras de erro |
capsize | float | Largura do remate das barras de erro |
align | str | Alinhamento das barras ('center' ou 'edge') |
label | str | Rótulo da legenda |
alpha | float | Transparê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.