Voltar ao Glossario
Glossario Python

Matplotlib: O que É e Como Funciona | Python Brasil

Aprenda Matplotlib em Python: graficos de linha, barra, dispersao, histograma, subplots, personalizacao e boas praticas para visualizacao de dados.

O que e Matplotlib?

Matplotlib e a biblioteca de visualizacao de dados mais utilizada em Python. Ela permite criar graficos estaticos, interativos e animados com qualidade para publicacao. Matplotlib e a base sobre a qual outras bibliotecas de visualizacao como Seaborn e pandas plotting sao construidas. Com ela, voce pode gerar graficos de linha, barra, dispersao, histogramas, pizza, mapas de calor e dezenas de outros tipos.

A interface principal e o modulo pyplot, que fornece uma API semelhante ao MATLAB para criacao rapida de graficos.

Instalacao e Primeiro Grafico

# Instalacao
# pip install matplotlib

import matplotlib.pyplot as plt

# Grafico de linha simples
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

plt.plot(x, y)
plt.xlabel('Eixo X')
plt.ylabel('Eixo Y')
plt.title('Meu Primeiro Grafico')
plt.savefig('grafico.png', dpi=150, bbox_inches='tight')
plt.show()

Tipos de Graficos

import matplotlib.pyplot as plt
import numpy as np

# Grafico de linha com multiplas series
meses = ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun']
vendas_2024 = [120, 135, 150, 145, 160, 175]
vendas_2025 = [140, 155, 170, 165, 180, 195]

plt.figure(figsize=(10, 6))
plt.plot(meses, vendas_2024, marker='o', label='2024', linewidth=2)
plt.plot(meses, vendas_2025, marker='s', label='2025', linewidth=2)
plt.title('Vendas Mensais')
plt.xlabel('Mes')
plt.ylabel('Vendas (unidades)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('vendas.png')

# Grafico de barras
categorias = ['Python', 'JavaScript', 'Java', 'Go', 'Rust']
popularidade = [85, 78, 65, 45, 30]

plt.figure(figsize=(8, 5))
cores = ['#3776ab', '#f7df1e', '#ed8b00', '#00add8', '#dea584']
plt.bar(categorias, popularidade, color=cores, edgecolor='black')
plt.title('Popularidade de Linguagens')
plt.ylabel('Indice de Popularidade')
plt.tight_layout()
plt.savefig('barras.png')

# Grafico de dispersao (scatter)
np.random.seed(42)
x = np.random.randn(100)
y = 2 * x + np.random.randn(100) * 0.5

plt.figure(figsize=(8, 6))
plt.scatter(x, y, alpha=0.6, c=y, cmap='viridis', edgecolors='black', linewidth=0.5)
plt.colorbar(label='Valor Y')
plt.xlabel('Variavel X')
plt.ylabel('Variavel Y')
plt.title('Grafico de Dispersao')
plt.tight_layout()
plt.savefig('dispersao.png')

# Histograma
dados = np.random.normal(170, 10, 1000)  # altura media 170cm

plt.figure(figsize=(8, 5))
plt.hist(dados, bins=30, edgecolor='black', alpha=0.7, color='steelblue')
plt.axvline(dados.mean(), color='red', linestyle='--', label=f'Media: {dados.mean():.1f}')
plt.xlabel('Altura (cm)')
plt.ylabel('Frequencia')
plt.title('Distribuicao de Alturas')
plt.legend()
plt.tight_layout()
plt.savefig('histograma.png')

Subplots

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2 * np.pi, 100)

# Multiplos graficos em uma figura
fig, axes = plt.subplots(2, 2, figsize=(12, 8))

axes[0, 0].plot(x, np.sin(x), color='blue')
axes[0, 0].set_title('Seno')

axes[0, 1].plot(x, np.cos(x), color='red')
axes[0, 1].set_title('Cosseno')

axes[1, 0].plot(x, np.tan(x), color='green')
axes[1, 0].set_ylim(-5, 5)
axes[1, 0].set_title('Tangente')

axes[1, 1].plot(x, np.exp(-x) * np.sin(x), color='purple')
axes[1, 1].set_title('Decaimento')

for ax in axes.flat:
    ax.set_xlabel('x')
    ax.set_ylabel('y')
    ax.grid(True, alpha=0.3)

fig.suptitle('Funcoes Trigonometricas', fontsize=16)
plt.tight_layout()
plt.savefig('subplots.png', dpi=150)

Personalizacao

import matplotlib.pyplot as plt

# Estilo global
plt.style.use('seaborn-v0_8-whitegrid')

# Configuracoes personalizadas
plt.rcParams.update({
    'font.size': 12,
    'axes.labelsize': 14,
    'axes.titlesize': 16,
    'figure.figsize': (10, 6),
    'figure.dpi': 100,
})

# Anotacoes e marcacoes
fig, ax = plt.subplots()
x = range(1, 8)
y = [10, 25, 15, 40, 30, 55, 45]

ax.plot(x, y, 'b-o', linewidth=2)
ax.annotate('Pico', xy=(6, 55), xytext=(4, 58),
            arrowprops=dict(arrowstyle='->', color='red'),
            fontsize=12, color='red')
ax.fill_between(x, y, alpha=0.1, color='blue')
ax.set_xlabel('Dia')
ax.set_ylabel('Valor')
ax.set_title('Dados com Anotacao')
plt.tight_layout()
plt.savefig('personalizado.png')

Integracao com Pandas

import matplotlib.pyplot as plt
import pandas as pd

# Pandas usa Matplotlib internamente
df = pd.DataFrame({
    'mes': ['Jan', 'Fev', 'Mar', 'Abr', 'Mai'],
    'receita': [5000, 6200, 5800, 7100, 6500],
    'despesa': [4200, 4800, 5100, 4900, 5300],
})

# Grafico diretamente do DataFrame
ax = df.plot(x='mes', y=['receita', 'despesa'], kind='bar',
             figsize=(10, 6), rot=0, color=['#2ecc71', '#e74c3c'])
ax.set_title('Receita vs Despesa')
ax.set_ylabel('Valor (R$)')
plt.tight_layout()
plt.savefig('pandas_plot.png')

Salvando Graficos

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([1, 2, 3], [1, 4, 9])

# PNG (raster) — para web e apresentacoes
fig.savefig('grafico.png', dpi=300, bbox_inches='tight',
            facecolor='white', transparent=False)

# SVG (vetor) — para documentos e escalabilidade
fig.savefig('grafico.svg', bbox_inches='tight')

# PDF — para publicacoes academicas
fig.savefig('grafico.pdf', bbox_inches='tight')

plt.close(fig)  # liberar memoria

Grafico de Pizza e Mapa de Calor

import matplotlib.pyplot as plt
import numpy as np

# Grafico de pizza
fig, ax = plt.subplots(figsize=(8, 8))
categorias = ['Python', 'JavaScript', 'Java', 'Outros']
fatias = [45, 25, 20, 10]
cores = ['#3776ab', '#f7df1e', '#ed8b00', '#cccccc']
explode = (0.05, 0, 0, 0)

ax.pie(fatias, labels=categorias, colors=cores, explode=explode,
       autopct='%1.1f%%', startangle=90, shadow=False)
ax.set_title('Linguagens Mais Usadas')
plt.tight_layout()
plt.savefig('pizza.png')

# Mapa de calor
dados = np.random.rand(5, 7)
fig, ax = plt.subplots(figsize=(10, 6))
im = ax.imshow(dados, cmap='YlOrRd', aspect='auto')
ax.set_xticks(range(7))
ax.set_xticklabels(['Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sab', 'Dom'])
ax.set_yticks(range(5))
ax.set_yticklabels(['Semana 1', 'Semana 2', 'Semana 3', 'Semana 4', 'Semana 5'])
fig.colorbar(im, label='Valor')
ax.set_title('Mapa de Calor Semanal')
plt.tight_layout()
plt.savefig('heatmap.png')

Erros Comuns

O erro mais frequente e nao chamar plt.tight_layout() ou bbox_inches='tight', resultando em labels cortados ao salvar. Outro erro e esquecer plt.close() apos salvar, acumulando figuras na memoria em loops. Tambem e comum confundir a interface pyplot (funcional) com a interface orientada a objetos (fig, ax), misturando-as de forma inconsistente. Nao especificar dpi ao salvar resulta em imagens de baixa resolucao para impressao.

Boas Praticas

Prefira a interface orientada a objetos (fig, ax = plt.subplots()) para maior controle. Sempre chame plt.tight_layout() antes de salvar. Use plt.close() em scripts que geram muitos graficos. Defina figsize e dpi adequados ao uso final. Escolha paletas de cores acessiveis para daltonicos. Para graficos estatisticos mais elegantes, considere Seaborn como camada sobre Matplotlib.

Quando Usar

Matplotlib e ideal para qualquer necessidade de visualizacao de dados em Python: analise exploratoria, relatorios, dashboards estaticos, publicacoes cientificas e apresentacoes. Para graficos interativos na web, considere Plotly ou Bokeh. Para visualizacao estatistica rapida, Seaborn oferece uma API de mais alto nivel construida sobre Matplotlib.