W3docs

Gráficos com Python Matplotlib: Um Guia Completo

Aprenda a criar e personalizar gráficos de linha, barras, pizza, dispersão e subplots em Python com Matplotlib, com exemplos claros.

Matplotlib é a biblioteca de visualização de dados mais amplamente utilizada em Python. Este guia explica como criar os tipos de gráficos mais comuns — gráficos de linha, barras, pizza, dispersão e subplots — e como personalizá-los com rótulos, cores, legendas e controles de layout. Pressupõe que você já tenha instalado o Matplotlib e possa executar scripts Python localmente.

O que é a plotagem com Matplotlib?

O módulo pyplot do Matplotlib fornece uma interface no estilo MATLAB que permite construir gráficos passo a passo: criar uma figura, adicionar dados, adicionar rótulos e, em seguida, exibir ou salvar o resultado. Todo gráfico segue o mesmo padrão:

  1. Importar matplotlib.pyplot (convencionalmente como plt).
  2. Chamar uma função de plotagem (plt.plot(), plt.bar(), etc.) com seus dados.
  3. Chamar funções decoradoras para adicionar títulos, rótulos de eixos, legendas e assim por diante.
  4. Chamar plt.show() para exibir a figura, ou plt.savefig() para gravá-la em disco.

Compreender essa sequência torna simples alternar entre tipos de gráficos e combiná-los em figuras mais complexas.

Instalando o Matplotlib

Se você ainda não instalou o Matplotlib, execute o seguinte comando no seu terminal:

pip install matplotlib

Verifique a instalação importando-o:

import matplotlib
print(matplotlib.__version__)  # e.g. 3.9.0

Criando um Gráfico de Linha

Um gráfico de linha é o tipo de gráfico padrão e é ideal para mostrar tendências ao longo do tempo ou qualquer sequência ordenada.

import matplotlib.pyplot as plt

# Data
years = [2015, 2016, 2017, 2018, 2019, 2020]
sales = [100, 150, 200, 250, 300, 350]

# Plot
plt.plot(years, sales)

# Labels and title
plt.xlabel("Year")
plt.ylabel("Sales (units)")
plt.title("Annual Sales")

plt.show()

plt.plot(x, y) desenha uma linha contínua conectando cada par (x, y). O eixo x mostra os anos e o eixo y mostra os valores de vendas, revelando a tendência de alta de um só olhar.

Plotando Múltiplas Linhas

Para comparar dois conjuntos de dados nos mesmos eixos, chame plt.plot() duas vezes antes de plt.show(). Use o parâmetro label e plt.legend() para identificar cada linha:

import matplotlib.pyplot as plt

years = [2018, 2019, 2020, 2021, 2022]
product_a = [120, 145, 170, 210, 260]
product_b = [90, 115, 140, 165, 195]

plt.plot(years, product_a, label="Product A")
plt.plot(years, product_b, label="Product B")

plt.xlabel("Year")
plt.ylabel("Revenue ($k)")
plt.title("Revenue by Product")
plt.legend()

plt.show()

O Matplotlib atribui automaticamente cores diferentes a cada série. Chamar plt.legend() adiciona uma legenda que mapeia as cores aos rótulos.

Criando um Gráfico de Barras

Os gráficos de barras comparam categorias discretas. Use plt.bar() para barras verticais e plt.barh() para barras horizontais.

import matplotlib.pyplot as plt

countries = ["USA", "China", "Japan", "Germany", "UK"]
gdp = [21.44, 14.14, 5.15, 4.17, 2.62]

plt.bar(countries, gdp, color="steelblue")

plt.xlabel("Country")
plt.ylabel("GDP (USD trillions)")
plt.title("Top 5 Economies by GDP")

plt.show()

A altura de cada barra representa o valor do PIB. O parâmetro color aceita qualquer cor CSS nomeada, string hexadecimal ou tupla RGB.

Gráficos de Barras Agrupadas

Quando você precisa comparar múltiplas categorias lado a lado, desloque as posições das barras manualmente usando range() e um deslocamento de largura:

import matplotlib.pyplot as plt

categories = ["Q1", "Q2", "Q3", "Q4"]
team_a = [30, 45, 38, 52]
team_b = [25, 40, 35, 48]

x = range(len(categories))
width = 0.35

plt.bar([i - width / 2 for i in x], team_a, width=width, label="Team A")
plt.bar([i + width / 2 for i in x], team_b, width=width, label="Team B")

plt.xticks(x, categories)
plt.xlabel("Quarter")
plt.ylabel("Sales")
plt.title("Quarterly Sales by Team")
plt.legend()

plt.show()

plt.xticks(x, categories) substitui as posições numéricas dos marcadores pelos nomes reais dos trimestres.

Criando um Gráfico de Pizza

Os gráficos de pizza mostram como as partes compõem um todo. Use-os com moderação — eles funcionam melhor com cinco ou menos fatias que somam 100%.

import matplotlib.pyplot as plt

brands = ["Samsung", "Apple", "Huawei", "Xiaomi", "Others"]
market_share = [19.2, 15.9, 14.6, 10.2, 40.1]

plt.pie(
    market_share,
    labels=brands,
    autopct="%1.1f%%",   # show percentage inside each slice
    startangle=90,       # rotate so the first slice starts at the top
)

plt.title("Smartphone Market Share")

plt.show()
  • autopct="%1.1f%%" imprime a porcentagem com uma casa decimal dentro de cada fatia.
  • startangle=90 rotaciona o gráfico para que a primeira fatia comece às 12 horas, o que é mais fácil de ler.

Nota: Os valores de participação de mercado acima são aproximados e são usados aqui apenas para ilustração.

Criando um Gráfico de Dispersão

Os gráficos de dispersão revelam a relação entre duas variáveis contínuas. Cada ponto representa uma observação.

import matplotlib.pyplot as plt

hours_studied = [1, 2, 3, 4, 5, 6, 7, 8]
exam_scores   = [45, 52, 60, 65, 72, 78, 85, 90]

plt.scatter(hours_studied, exam_scores, color="coral", edgecolors="black", s=80)

plt.xlabel("Hours Studied")
plt.ylabel("Exam Score")
plt.title("Study Time vs. Exam Score")

plt.show()

O parâmetro s controla o tamanho do marcador em pontos ao quadrado. edgecolors="black" adiciona um contorno a cada ponto, tornando-os mais fáceis de distinguir quando os pontos se sobrepõem.

Para um estudo mais aprofundado, consulte o capítulo Gráfico de Dispersão com Matplotlib.

Personalizando a Aparência do Gráfico

O Matplotlib oferece controle detalhado sobre praticamente todos os elementos visuais.

Cores, Marcadores e Estilos de Linha

Passe uma string de formato como terceiro argumento para plt.plot() para definir o estilo do marcador, o estilo da linha e a cor em uma única etapa:

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

plt.plot(x, y, "ro--")   # red circles, dashed line
plt.xlabel("x")
plt.ylabel("y")
plt.title("Custom Style")
plt.show()

A string de formato "ro--" combina:

  • r — cor vermelha
  • o — marcador circular
  • -- — linha tracejada

Códigos comuns de string de formato:

CódigoSignificadoCódigoSignificado
bazul-linha sólida
gverde--linha tracejada
rvermelho-.linha traço-ponto
kpreto:linha pontilhada
ocírculosquadrado
^triângulo para cima*estrela

Você também pode passar argumentos de palavra-chave para maior controle:

plt.plot(x, y, color="#2196f3", linewidth=2, linestyle="--", marker="o", markersize=8)

Tamanho da Figura e DPI

Defina as dimensões da figura (em polegadas) antes de plotar chamando plt.figure():

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 5), dpi=100)   # 1000×500 pixels

x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]

plt.plot(x, y)
plt.title("Wide Figure")
plt.show()

figsize=(width, height) recebe valores em polegadas. dpi (pontos por polegada) controla a densidade de pixels — 100 dpi é adequado para tela; 300 dpi é típico para impressão.

Adicionando uma Grade

Uma grade facilita a leitura dos valores:

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [3, 7, 2, 9, 4]

plt.plot(x, y, marker="o")
plt.grid(True, linestyle="--", alpha=0.7)
plt.title("Plot with Grid")
plt.show()

alpha=0.7 torna as linhas da grade semitransparentes para que não sobreponham os dados. Consulte o capítulo Grade do Matplotlib para mais opções.

Criando Subplots

Os subplots permitem exibir múltiplos gráficos em uma única figura, o que é útil para comparar diferentes perspectivas do mesmo conjunto de dados.

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y1 = [2, 4, 6, 8, 10]
y2 = [1, 4, 9, 16, 25]
y3 = [5, 3, 7, 2, 8]
y4 = [10, 7, 4, 5, 6]

fig, axes = plt.subplots(2, 2, figsize=(10, 8))

axes[0][0].plot(x, y1, "b-o")
axes[0][0].set_title("Linear")

axes[0][1].plot(x, y2, "r--s")
axes[0][1].set_title("Quadratic")

axes[1][0].bar(x, y3, color="green")
axes[1][0].set_title("Bar Chart")

axes[1][1].scatter(x, y4, color="purple", s=80)
axes[1][1].set_title("Scatter")

plt.tight_layout()   # prevent overlapping labels
plt.show()

plt.subplots(rows, cols) retorna um objeto Figure e um array 2D de objetos Axes. Trabalhar com objetos Axes individuais (por exemplo, axes[0][0].plot(...)) é a abordagem preferida para layouts com múltiplos gráficos, pois oferece controle independente sobre cada painel. plt.tight_layout() ajusta automaticamente o espaçamento para que títulos e rótulos não se sobreponham.

Consulte o capítulo Subplots do Matplotlib para opções avançadas de layout.

Salvando um Gráfico em um Arquivo

plt.savefig() grava a figura atual em disco. O formato do arquivo é inferido a partir da extensão:

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

plt.plot(x, y, marker="o")
plt.title("Saved Plot")

plt.savefig("my_plot.png", dpi=150, bbox_inches="tight")
  • Os formatos suportados incluem .png, .jpg, .svg e .pdf.
  • bbox_inches="tight" remove o espaço em branco ao redor da figura para que nada seja cortado.
  • Sempre chame plt.savefig() antes de plt.show()plt.show() limpa o estado da figura.

Armadilhas Comuns

plt.show() limpa a figura. Se você chamar plt.savefig() após plt.show(), salvará uma imagem em branco. Sempre salve primeiro, depois exiba.

Executando em ambientes não interativos. Em scripts, plt.show() abre uma janela GUI e bloqueia até ser fechada. Em notebooks Jupyter, use %matplotlib inline no topo para que os gráficos sejam renderizados inline. Em servidores sem interface gráfica (CI, Docker), mude para um backend não interativo: import matplotlib; matplotlib.use("Agg") antes de importar pyplot.

Esquecer de fechar figuras. Cada chamada a plt.figure() abre uma nova figura na memória. Em loops que geram muitos gráficos, feche cada um com plt.close() para evitar o esgotamento de memória.

import matplotlib.pyplot as plt

for i in range(10):
    plt.plot([1, 2, 3], [i, i * 2, i * 3])
    plt.savefig(f"plot_{i}.png")
    plt.close()   # release memory

Subplots sobrepostos. Chamar plt.tight_layout() ou plt.subplots_adjust() após criar todos os subplots corrige títulos e rótulos de marcadores sobrepostos.

Resumo

Tipo de gráficoFunçãoMelhor utilizado para
Gráfico de linhaplt.plot()Tendências em dados ordenados
Gráfico de barrasplt.bar() / plt.barh()Comparar categorias discretas
Gráfico de pizzaplt.pie()Composição parte-a-todo
Gráfico de dispersãoplt.scatter()Relação entre duas variáveis
Subplotsplt.subplots()Múltiplos gráficos em uma figura

Capítulos Relacionados

Was this page helpful?