W3docs

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 matplotlib

Se 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 / 2 desloca a primeira série para a esquerda; x + width / 2 desloca a segunda série para a direita, de modo que as barras ficam lado a lado.
  • ax.set_xticks(x) e ax.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

TarefaCódigo
Gráfico de barras verticalplt.bar(x, y)
Gráfico de barras horizontalplt.barh(y, width)
Alterar corplt.bar(x, y, color='steelblue')
Alterar larguraplt.bar(x, y, width=0.5)
Barras empilhadasplt.bar(x, y2, bottom=y1)
Barras de erroplt.bar(x, y, yerr=errors, capsize=5)
Adicionar rótulos de valoresax.bar_label(bars, padding=3)
Rotacionar rótulos do eixo xplt.xticks(rotation=45, ha='right')
Salvar em arquivoplt.savefig('file.png', dpi=150)

Capítulos Relacionados

Was this page helpful?