Skip to content

Anotações e texto no Matplotlib: destaque os insights

Updated on

Picos sem marcação ou barras sem rótulo deixam o leitor adivinhar. Se o texto se sobrepõe ou fica longe dos dados, a mensagem se perde. Anotações claras resolvem: frases curtas, setas bem posicionadas e fontes consistentes que guiam o olhar sem poluir.

Escolha a ferramenta certa

TarefaFerramentaPor quê
Marcar ponto com setaannotateTexto + seta em uma chamada
Texto livre em coords do eixotextTítulos, notas de painel
Rotular barras automaticamentebar_labelPrende o rótulo na barra
Manter rótulos dentroclip_on=True, offsetsEvita que o texto saia do gráfico
Quebrar/formatar textotextwrap.fill, f-stringsMantém rótulos curtos e legíveis

Anote picos com setas

import matplotlib.pyplot as plt
import numpy as np
 
x = np.linspace(0, 10, 300)
y = np.sin(x) * np.exp(-x / 5)
 
fig, ax = plt.subplots(figsize=(7, 4))
ax.plot(x, y, color="tab:blue")
 
peak_idx = np.argmax(y)
peak_x, peak_y = x[peak_idx], y[peak_idx]
 
ax.annotate(
    "Pico",
    xy=(peak_x, peak_y),
    xytext=(peak_x + 1.2, peak_y + 0.2),
    arrowprops=dict(arrowstyle="->", color="tab:red", lw=1.5),
    bbox=dict(boxstyle="round,pad=0.3", fc="white", ec="tab:red", alpha=0.9),
    fontsize=10,
    color="tab:red",
)
 
ax.set_xlabel("Tempo (s)")
ax.set_ylabel("Amplitude")
ax.grid(True, linestyle="--", alpha=0.3)
plt.tight_layout()
plt.show()

Dicas:

  • Desloque xytext para manter a seta curta e clara.
  • Fundo claro (bbox) ajuda em gráficos carregados.
  • Use 2–4 palavras para não cobrir os dados.

Rotule barras sem sobrepor

import matplotlib.pyplot as plt
 
items = ["A", "B", "C", "D"]
values = [28, 35, 30, 22]
 
fig, ax = plt.subplots(figsize=(6, 4))
bars = ax.bar(items, values, color="tab:purple", alpha=0.9)
 
ax.bar_label(bars, labels=[f"{v}k" for v in values], padding=3)
ax.set_ylabel("Unidades vendidas")
ax.set_ylim(0, 40)
 
plt.tight_layout()
plt.show()

Dicas:

  • padding controla a distância; valor negativo coloca o texto dentro do bar.
  • Em barras empilhadas, use label_type="center" para centralizar cada pilha.
  • Valores baixos? Texto branco dentro da barra para melhor contraste.

Notas inline e posicionamento seguro

ax.text(
    0.02, 0.95, "Experimento 3\nn=120",
    transform=ax.transAxes,
    ha="left", va="top",
    fontsize=9,
    bbox=dict(boxstyle="round", fc="white", ec="0.7", alpha=0.8)
)

Guia:

  • Com transform=ax.transAxes, posições 0–1 ficam fixas mesmo após redimensionar.
  • Use clip_on=True quando o texto deve permanecer dentro do eixo.
  • Ajuste ha/va e quebras de linha curtas para evitar colisões nas bordas.

Checklist rápido

  • Rótulos sobrepostos? Reduza a fonte, ajuste padding ou gire levemente.
  • Seta sumiu? Aumente o zorder ou desenhe após áreas preenchidas.
  • Texto para fora? constrained_layout=True ou quebre com textwrap.fill.