Gráficos de Barras com Matplotlib em Python — Guia Completo
Aprenda a criar gráficos de barras verticais, horizontais, agrupados e empilhados em Python com Matplotlib. Inclui cor, largura, barras de erro e exemplos.
As funções bar() e barh() do Matplotlib permitem criar gráficos de barras para comparar quantidades entre categorias. Este capítulo abrange desde o gráfico mais simples de uma única série até layouts agrupados e empilhados, com opções práticas de personalização que você usará em projetos reais: cores, largura das barras, estilo das bordas, barras de erro e como salvar o resultado em um arquivo.
Antes de começar, certifique-se de que o Matplotlib está instalado:
pip install matplotlibSe você é novo na biblioteca, consulte primeiro os capítulos de Introdução ao Matplotlib e Primeiros Passos.
O que é um Gráfico de Barras?
Um gráfico de barras utiliza barras retangulares cujo comprimento representa um valor numérico, facilitando a comparação de quantidades entre categorias discretas — por exemplo, receita mensal, população por país ou notas por disciplina.
Use um gráfico de barras quando:
- Você está comparando uma única métrica entre categorias (gráfico de barras simples).
- Você quer mostrar como um total se divide em partes (gráfico de barras empilhadas).
- Você precisa comparar várias métricas lado a lado para as mesmas categorias (gráfico de barras agrupadas).
- Os rótulos de suas categorias são longos e ficam mais legíveis na horizontal (gráfico de barras horizontal).
Criando um Gráfico de Barras Vertical Básico
A função plt.bar(x, height) recebe uma sequência de rótulos de categoria (ou posições numéricas) e uma sequência correspondente de alturas das barras.
import matplotlib.pyplot as plt
categories = ['A', 'B', 'C', 'D', 'E']
values = [10, 24, 36, 40, 15]
plt.bar(categories, values)
plt.title('Sample Bar Chart')
plt.xlabel('Category')
plt.ylabel('Value')
plt.tight_layout()
plt.show()plt.tight_layout() evita que os rótulos dos eixos sejam cortados — um bom hábito a adotar antes de cada chamada a show() ou savefig().
Personalizando a Aparência das Barras
Cor
Passe um nome de cor único, uma string hexadecimal ou uma lista de cores por barra ao parâmetro color:
import matplotlib.pyplot as plt
categories = ['A', 'B', 'C', 'D', 'E']
values = [10, 24, 36, 40, 15]
# One color for all bars
plt.bar(categories, values, color='steelblue')
plt.title('Steelblue Bars')
plt.xlabel('Category')
plt.ylabel('Value')
plt.tight_layout()
plt.show()Para colorir cada barra de forma diferente, passe uma lista:
import matplotlib.pyplot as plt
categories = ['A', 'B', 'C', 'D', 'E']
values = [10, 24, 36, 40, 15]
colors = ['#e74c3c', '#3498db', '#2ecc71', '#f39c12', '#9b59b6']
plt.bar(categories, values, color=colors)
plt.title('Multi-Color Bar Chart')
plt.xlabel('Category')
plt.ylabel('Value')
plt.tight_layout()
plt.show()Largura das Barras e Cor da Borda
O valor padrão de width é 0.8 (80% do espaço entre as posições dos tiques). Diminua-o para um visual mais leve ou aumente-o para preencher mais espaço. edgecolor desenha um contorno em torno de cada barra:
import matplotlib.pyplot as plt
categories = ['A', 'B', 'C', 'D', 'E']
values = [10, 24, 36, 40, 15]
plt.bar(
categories, values,
width=0.5,
color='cornflowerblue',
edgecolor='navy',
linewidth=1.2,
)
plt.title('Custom Width and Edge')
plt.xlabel('Category')
plt.ylabel('Value')
plt.tight_layout()
plt.show()Adicionando uma Legenda
Passe uma string label para bar() e depois chame plt.legend():
import matplotlib.pyplot as plt
categories = ['A', 'B', 'C', 'D', 'E']
values = [10, 24, 36, 40, 15]
plt.bar(categories, values, color='teal', label='2024 Sales')
plt.legend()
plt.title('Bar Chart with Legend')
plt.xlabel('Category')
plt.ylabel('Value')
plt.tight_layout()
plt.show()Rotacionando os Rótulos dos Tiques
Nomes de categoria longos se sobrepõem, a menos que você os rotacione com plt.xticks(rotation=...):
import matplotlib.pyplot as plt
months = ['January', 'February', 'March', 'April', 'May', 'June']
sales = [120, 95, 140, 160, 130, 175]
plt.bar(months, sales, color='darkorange')
plt.xticks(rotation=45, ha='right') # ha='right' aligns the labels nicely
plt.title('Monthly Sales')
plt.xlabel('Month')
plt.ylabel('Units Sold')
plt.tight_layout()
plt.show()Gráficos de Barras Horizontais
plt.barh(y, width) desenha barras que se estendem horizontalmente. É especialmente útil quando os rótulos de categoria são longos, pois aparecem no eixo y com bastante espaço horizontal.
import matplotlib.pyplot as plt
languages = ['Python', 'JavaScript', 'Java', 'C#', 'TypeScript']
popularity = [30.3, 25.1, 17.8, 12.4, 9.6]
plt.barh(languages, popularity, color='mediumseagreen')
plt.title('Programming Language Popularity (%)')
plt.xlabel('Share (%)')
plt.ylabel('Language')
plt.tight_layout()
plt.show()Dica: ordene os dados antes de plotar para que a categoria mais popular apareça no topo:
import matplotlib.pyplot as plt
languages = ['Python', 'JavaScript', 'Java', 'C#', 'TypeScript']
popularity = [30.3, 25.1, 17.8, 12.4, 9.6]
# Sort ascending so the highest bar ends up at the top after barh reversal
pairs = sorted(zip(popularity, languages))
popularity_sorted, languages_sorted = zip(*pairs)
plt.barh(languages_sorted, popularity_sorted, color='mediumseagreen')
plt.title('Programming Language Popularity (sorted)')
plt.xlabel('Share (%)')
plt.tight_layout()
plt.show()Gráficos de Barras Agrupadas
Um gráfico de barras agrupadas (lado a lado) compara duas ou mais séries para o mesmo conjunto de categorias. O Matplotlib não possui uma função dedicada para isso — você o cria deslocando as posições x de cada série usando NumPy:
import matplotlib.pyplot as plt
import numpy as np
categories = ['Q1', 'Q2', 'Q3', 'Q4']
sales_2023 = [120, 135, 150, 170]
sales_2024 = [140, 160, 145, 195]
x = np.arange(len(categories)) # [0, 1, 2, 3]
width = 0.35 # width of each individual bar
fig, ax = plt.subplots()
bars1 = ax.bar(x - width / 2, sales_2023, width, label='2023', color='steelblue')
bars2 = ax.bar(x + width / 2, sales_2024, width, label='2024', color='darkorange')
ax.set_title('Quarterly Sales Comparison')
ax.set_xlabel('Quarter')
ax.set_ylabel('Units Sold')
ax.set_xticks(x)
ax.set_xticklabels(categories)
ax.legend()
plt.tight_layout()
plt.show()Pontos principais:
x - width / 2desloca a primeira série para a esquerda;x + width / 2desloca a segunda série para a direita, de modo que as barras ficam lado a lado.ax.set_xticks(x)eax.set_xticklabels(categories)posicionam os rótulos de categoria no centro de cada grupo.- A API orientada a objetos (
fig, ax = plt.subplots()) é preferida para gráficos agrupados porque oferece controle explícito sobre cada eixo.
Adicionando Rótulos de Valores nas Barras
Você pode anotar cada barra com seu valor usando ax.bar_label() (adicionado no Matplotlib 3.4):
import matplotlib.pyplot as plt
import numpy as np
categories = ['Q1', 'Q2', 'Q3', 'Q4']
sales_2023 = [120, 135, 150, 170]
sales_2024 = [140, 160, 145, 195]
x = np.arange(len(categories))
width = 0.35
fig, ax = plt.subplots()
bars1 = ax.bar(x - width / 2, sales_2023, width, label='2023', color='steelblue')
bars2 = ax.bar(x + width / 2, sales_2024, width, label='2024', color='darkorange')
ax.bar_label(bars1, padding=3)
ax.bar_label(bars2, padding=3)
ax.set_title('Quarterly Sales with Labels')
ax.set_xlabel('Quarter')
ax.set_ylabel('Units Sold')
ax.set_xticks(x)
ax.set_xticklabels(categories)
ax.legend()
plt.tight_layout()
plt.show()Gráficos de Barras Empilhadas
Um gráfico de barras empilhadas sobrepõe as séries umas sobre as outras, mostrando como as partes individuais contribuem para um total. Use o parâmetro bottom para indicar ao Matplotlib onde cada série deve começar:
import matplotlib.pyplot as plt
import numpy as np
categories = ['A', 'B', 'C', 'D', 'E']
series1 = [10, 24, 36, 40, 15]
series2 = [ 5, 12, 15, 20, 10]
series3 = [ 8, 6, 10, 12, 7]
x = np.arange(len(categories))
plt.bar(x, series1, label='Group 1', color='steelblue')
plt.bar(x, series2, label='Group 2', color='darkorange',
bottom=series1)
plt.bar(x, series3, label='Group 3', color='seagreen',
bottom=np.array(series1) + np.array(series2))
plt.xticks(x, categories)
plt.title('Stacked Bar Chart')
plt.xlabel('Category')
plt.ylabel('Total Value')
plt.legend()
plt.tight_layout()
plt.show()O bottom da terceira série é a soma elemento a elemento das duas primeiras, de modo que cada barra começa exatamente onde a anterior terminou. Usar np.array() garante que a adição funcione corretamente para listas.
Barras de Erro
Quando seus dados possuem incerteza ou variabilidade (por exemplo, desvio padrão ao longo de medições repetidas), adicione barras de erro com o parâmetro yerr:
import matplotlib.pyplot as plt
import numpy as np
categories = ['Control', 'Treatment A', 'Treatment B', 'Treatment C']
means = [5.2, 7.8, 6.1, 9.4]
std_devs = [0.5, 0.8, 0.6, 1.1]
plt.bar(
categories, means,
yerr=std_devs,
capsize=5, # width of the error bar caps
color='cornflowerblue',
edgecolor='black',
linewidth=0.8,
)
plt.title('Experimental Results with Error Bars')
plt.xlabel('Group')
plt.ylabel('Mean Value')
plt.tight_layout()
plt.show()capsize controla as tampas horizontais no topo e na base de cada barra de erro; um valor entre 4 e 6 costuma ser legível.
Salvando um Gráfico de Barras em um Arquivo
Use plt.savefig() em vez de plt.show() (ou chame-o antes de show()). Você pode especificar o formato pela extensão do arquivo:
import matplotlib.pyplot as plt
categories = ['A', 'B', 'C', 'D', 'E']
values = [10, 24, 36, 40, 15]
plt.bar(categories, values, color='steelblue')
plt.title('Saved Bar Chart')
plt.xlabel('Category')
plt.ylabel('Value')
plt.tight_layout()
# Save as PNG at 150 dpi
plt.savefig('bar_chart.png', dpi=150)
# Save as vector PDF (ideal for publications)
plt.savefig('bar_chart.pdf')
plt.show()Opções de formato comuns: png, pdf, svg, eps. Use svg ou pdf quando precisar de uma imagem escalável e pronta para impressão.
Controlando o Tamanho da Figura
Por padrão, o Matplotlib cria uma figura de 6,4 × 4,8 polegadas. Passe figsize=(width, height) para plt.figure() ou plt.subplots() para alterar esse valor:
import matplotlib.pyplot as plt
categories = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
values = [80, 70, 95, 110, 130, 150, 160, 155, 120, 100, 85, 90]
fig, ax = plt.subplots(figsize=(12, 5)) # wider figure for 12 months
ax.bar(categories, values, color='tomato')
ax.set_title('Monthly Data')
ax.set_xlabel('Month')
ax.set_ylabel('Value')
plt.tight_layout()
plt.savefig('monthly_bar_chart.png', dpi=150)
plt.show()Referência Rápida
| Tarefa | Código |
|---|---|
| Gráfico de barras vertical | plt.bar(x, y) |
| Gráfico de barras horizontal | plt.barh(y, width) |
| Alterar cor | plt.bar(x, y, color='steelblue') |
| Alterar largura | plt.bar(x, y, width=0.5) |
| Barras empilhadas | plt.bar(x, y2, bottom=y1) |
| Barras de erro | plt.bar(x, y, yerr=errors, capsize=5) |
| Adicionar rótulos de valores | ax.bar_label(bars, padding=3) |
| Rotacionar rótulos do eixo x | plt.xticks(rotation=45, ha='right') |
| Salvar em arquivo | plt.savefig('file.png', dpi=150) |
Capítulos Relacionados
- Introdução ao Matplotlib — visão geral da biblioteca e instalação
- Gráficos de Linhas com Matplotlib — tendências em dados contínuos
- Gráficos de Dispersão com Matplotlib — relações entre duas variáveis
- Histogramas com Matplotlib — distribuição de uma única variável
- Gráficos de Pizza com Matplotlib — proporções parte-todo
- Rótulos no Matplotlib — rótulos de eixos, títulos e anotações
- Grade no Matplotlib — adicionando e estilizando linhas de grade
- Subplots no Matplotlib — múltiplos gráficos em uma única figura