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:
- Importar
matplotlib.pyplot(convencionalmente comoplt). - Chamar uma função de plotagem (
plt.plot(),plt.bar(), etc.) com seus dados. - Chamar funções decoradoras para adicionar títulos, rótulos de eixos, legendas e assim por diante.
- Chamar
plt.show()para exibir a figura, ouplt.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 matplotlibVerifique a instalação importando-o:
import matplotlib
print(matplotlib.__version__) # e.g. 3.9.0Criando 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=90rotaciona 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 vermelhao— marcador circular--— linha tracejada
Códigos comuns de string de formato:
| Código | Significado | Código | Significado |
|---|---|---|---|
b | azul | - | linha sólida |
g | verde | -- | linha tracejada |
r | vermelho | -. | linha traço-ponto |
k | preto | : | linha pontilhada |
o | círculo | s | quadrado |
^ | 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,.svge.pdf. bbox_inches="tight"remove o espaço em branco ao redor da figura para que nada seja cortado.- Sempre chame
plt.savefig()antes deplt.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 memorySubplots 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áfico | Função | Melhor utilizado para |
|---|---|---|
| Gráfico de linha | plt.plot() | Tendências em dados ordenados |
| Gráfico de barras | plt.bar() / plt.barh() | Comparar categorias discretas |
| Gráfico de pizza | plt.pie() | Composição parte-a-todo |
| Gráfico de dispersão | plt.scatter() | Relação entre duas variáveis |
| Subplots | plt.subplots() | Múltiplos gráficos em uma figura |
Capítulos Relacionados
- Introdução ao Matplotlib — visão geral da biblioteca e seus componentes
- Primeiros Passos com Matplotlib — instalação e seu primeiro gráfico
- Gráficos de Linha com Matplotlib — estilos de linha, marcadores e gráficos com múltiplas séries em profundidade
- Gráficos de Barras com Matplotlib — barras verticais, horizontais e empilhadas
- Gráficos de Pizza com Matplotlib — fatias explodidas, cores personalizadas e gráficos de rosca
- Histogramas com Matplotlib — gráficos de distribuição e controle de intervalos
- Gráfico de Dispersão com Matplotlib — gráficos de bolhas e dispersão com mapeamento de cores
- Subplots com Matplotlib — layouts avançados com múltiplos painéis
- Rótulos com Matplotlib — títulos, rótulos de eixos, anotações e texto
- Grade com Matplotlib — linhas de grade e personalização de marcadores
- Marcadores com Matplotlib — estilos, tamanhos e cores de borda dos marcadores