Anotaciones y texto en Matplotlib: resalta insights con claridad
Updated on
Picos sin marcar o barras sin etiqueta obligan al lector a adivinar. Si el texto se superpone o queda lejos de los datos, la historia se pierde. Anotaciones claras lo resuelven: etiquetas cortas, flechas bien colocadas y fuentes coherentes que guían la atención sin añadir ruido.
Elige la herramienta de texto adecuada
| Tarea | Herramienta | Por qué |
|---|---|---|
| Marcar un punto con flecha | annotate | Texto y flecha en una sola llamada |
| Añadir texto libre en coords del eje | text | Títulos, notas en paneles |
| Etiquetar barras automáticamente | bar_label | Ancla las etiquetas a las barras |
| Mantener etiquetas dentro del eje | clip_on=True, offsets | Evita que el texto se salga del plot |
| Envolver/formatear texto | textwrap.fill, f-strings | Mantiene etiquetas cortas y legibles |
Anota picos con flechas
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(
"Señal 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("Tiempo (s)")
ax.set_ylabel("Amplitud")
ax.grid(True, linestyle="--", alpha=0.3)
plt.tight_layout()
plt.show()Consejos:
- Desplaza el texto (
xytext) para que la flecha quede corta y legible. - Usa un fondo claro (
bbox) cuando el gráfico esté cargado. - Frases breves (2–4 palabras) evitan tapar datos.
Etiqueta barras sin solaparlas
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()Consejos:
paddingcontrola la distancia; usa negativo para etiquetas dentro del bar.- En barras apiladas,
label_type="center"coloca el texto en el centro de cada pila. - Con valores pequeños, cambia el color del texto a blanco y coloca la etiqueta dentro.
Notas inline y colocación segura
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)
)Guías:
- Con
transform=ax.transAxes, las posiciones (0–1) se mantienen al redimensionar. - Usa
clip_on=Truesi el texto debe quedarse dentro del plot. - Alinea con
ha/vay añade saltos de línea cortos para evitar choques con los bordes.
Checklist de solución
- ¿Etiquetas montadas? Reduce fuente, ajusta
paddingo gira ligeramente el texto. - ¿Flecha oculta? Sube el
zordero dibuja la anotación después de áreas rellenas. - ¿Texto fuera del gráfico? Activa
constrained_layout=Trueo recorta contextwrap.fill.