Gráficos com Python — Matplotlib

Laboratório de Programação — Ciência da Computação • UFPI

Figuras & Eixos, Pyplot, NumPy/Pandas, personalização, subplots e gráficos 2D comuns — com syntax highlighting

O que é o Matplotlib?

  • Biblioteca de visualização amplamente usada em Python.
  • Gera gráficos estáticos, interativos e até 3D.
  • Conceitos centrais: Figure (figura) e Axes (eixos/área de plotagem).
  • Integra-se bem com NumPy e Pandas; exporta para PNG, SVG, PDF, etc.
pip install matplotlib numpy pandas

Conteúdo alinhado ao material do curso (UFPI).

Figure & Axes (Pyplot)

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)
y = np.sin(x)

fig, ax = plt.subplots(figsize=(6, 3))  # cria Figure e Axes
ax.plot(x, y, label="sen(x)")
ax.set_title("Seno simples")
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.legend()
plt.show()

Personalização

  • Rótulos e título: set_xlabel, set_ylabel, set_title
  • Limites: set_xlim, set_ylim
  • Estilo: cores, marcadores, tipos de linha
  • Legenda: legend()
  • Grade: grid(True)

Eixo X & Eixo Y

fig, ax = plt.subplots()
ax.plot(x, np.cos(x))
ax.set_xlim(0, 10)     # limites do eixo x
ax.set_ylim(-1, 1)     # limites do eixo y
ax.grid(True)
plt.show()

Rotulando eixos

fig, ax = plt.subplots()
ax.plot(x, np.sin(x) * np.exp(-0.2*x))
ax.set_xlabel("Tempo (s)")
ax.set_ylabel("Amplitude")
ax.set_title("Sinal amortecido")
plt.show()

Função plot (linhas)

x = np.linspace(-2, 2, 200)
y1 = 2*x + 1                     # reta
y2 = x**2 - 1                    # 2º grau
y3 = 0.5*x**3 - 0.2*x            # 3º grau

fig, ax = plt.subplots()
ax.plot(x, y1, label="reta", color="black", linestyle="--")
ax.plot(x, y2, label="quadrática", color="tab:blue")
ax.plot(x, y3, label="cúbica", color="tab:orange")
ax.legend(); ax.grid(True)
plt.show()

Múltiplos gráficos (Subplots)

fig, axs = plt.subplots(1, 3, figsize=(10, 3), sharex=True)
axs[0].plot(x, y1); axs[0].set_title("Reta")
axs[1].plot(x, y2); axs[1].set_title("Quadrática")
axs[2].plot(x, y3); axs[2].set_title("Cúbica")
for ax in axs: ax.grid(True)
fig.suptitle("Comparação de funções")
fig.tight_layout()
plt.show()

Útil para comparar múltiplos conjuntos de dados.

Gráfico de Barras

categorias = ["A", "B", "C", "D"]
valores = [12, 7, 15, 9]

fig, ax = plt.subplots()
ax.bar(categorias, valores, color="tab:green")
ax.set_title("Barras")
ax.set_ylabel("Valor")
for i, v in enumerate(valores):
    ax.text(i, v + .3, str(v), ha="center")
plt.show()

Gráfico de Pizza (Pie)

labels = ["Maçã", "Banana", "Laranja", "Uva"]
sizes  = [30, 25, 25, 20]

fig, ax = plt.subplots()
ax.pie(sizes, labels=labels, autopct="%1.1f%%", startangle=90)
ax.axis("equal")  # deixa circular
ax.set_title("Preferências")
plt.show()

Dispersão (Scatter)

rng = np.random.default_rng(42)
x = rng.normal(loc=50, scale=10, size=200)
y = 0.8*x + rng.normal(scale=5, size=200)

fig, ax = plt.subplots()
ax.scatter(x, y, alpha=0.7, edgecolor="k")
ax.set_title("Correlação aproximada")
ax.set_xlabel("X"); ax.set_ylabel("Y")
plt.show()

Histograma

data = rng.normal(loc=0, scale=1, size=1000)
fig, ax = plt.subplots()
ax.hist(data, bins=30, color="tab:purple", alpha=0.8)
ax.set_title("Distribuição Normal")
ax.set_xlabel("Valor"); ax.set_ylabel("Frequência")
plt.show()

Boxplot

dados = [rng.normal(0, 1, 200),
         rng.normal(1, 1.5, 200),
         rng.normal(-1, 0.5, 200)]

fig, ax = plt.subplots()
ax.boxplot(dados, labels=["A", "B", "C"], notch=True)
ax.set_title("Distribuições — Boxplot")
plt.show()

Resumo robusto: mediana, quartis e possíveis outliers.

Lendo dados de .csv (Pandas)

import pandas as pd

df = pd.read_csv("vendas.csv")  # colunas: categoria, total
fig, ax = plt.subplots()
ax.bar(df["categoria"], df["total"], color="tab:blue")
ax.set_title("Vendas por categoria")
ax.set_ylabel("Total")
plt.show()

Barras horizontais (CSV)

fig, ax = plt.subplots()
ordenado = df.sort_values("total")
ax.barh(ordenado["categoria"], ordenado["total"], color="tab:orange")
ax.set_title("Vendas (ordem crescente)")
ax.set_xlabel("Total")
plt.show()

Estilos & Layout

plt.style.use("seaborn-v0_8")   # aplica estilo global
fig, ax = plt.subplots()
ax.plot(np.linspace(0,1,50), np.linspace(0,1,50)**2)
fig.tight_layout()              # ajusta espaçamentos
plt.show()

Exportando figuras

fig, ax = plt.subplots()
ax.plot([0,1,2], [2,1,3])
fig.savefig("grafico.png", dpi=300, bbox_inches="tight")
fig.savefig("grafico.pdf")

Encapsulando em classes (extra)

class GraficoLinha:
    def __init__(self, x, y, titulo="Linha"):
        self.x, self.y, self.titulo = x, y, titulo
    def plot(self):
        fig, ax = plt.subplots()
        ax.plot(self.x, self.y)
        ax.set_title(self.titulo)
        ax.grid(True); plt.show()

# Uso
g = GraficoLinha(np.arange(0, 5), np.arange(0, 5)**2, "Quadrática")
g.plot()

Padrão inspirado no material: organizar gráficos via classes auxiliares.

Exercícios (Lab)

  1. Replique o gráfico de linha, curva de 2º e 3º grau em subplots.
  2. Gere um scatter com 2 clusters e destaque as médias.
  3. Abra um CSV de vendas e plote barras horizontais ordenadas.
  4. Exporte um gráfico para PNG e PDF com bbox_inches="tight".

Conclusões

  • Matplotlib oferece base sólida e flexível para visualizações 2D.
  • Domine Figure/Axes, personalização e subplots para ganhar produtividade.
  • Integração com NumPy/Pandas e exportação facilitam o fluxo de análise.