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.