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
| Tarefa | Ferramenta | Por quê |
|---|---|---|
| Marcar ponto com seta | annotate | Texto + seta em uma chamada |
| Texto livre em coords do eixo | text | Títulos, notas de painel |
| Rotular barras automaticamente | bar_label | Prende o rótulo na barra |
| Manter rótulos dentro | clip_on=True, offsets | Evita que o texto saia do gráfico |
| Quebrar/formatar texto | textwrap.fill, f-strings | Manté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
xytextpara 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:
paddingcontrola 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=Truequando o texto deve permanecer dentro do eixo. - Ajuste
ha/vae quebras de linha curtas para evitar colisões nas bordas.
Checklist rápido
- Rótulos sobrepostos? Reduza a fonte, ajuste
paddingou gire levemente. - Seta sumiu? Aumente o
zorderou desenhe após áreas preenchidas. - Texto para fora?
constrained_layout=Trueou quebre comtextwrap.fill.