HOWTO · Matplotlib

Añadir texto dentro del gráfico en Matplotlib

Este tutorial muestra cómo usar la función `matplotlib.pyplot.text()` para añadir texto en una posición elegida dentro de un gráfico de Matplotlib.

En esta página

Usa matplotlib.pyplot.text() para colocar una etiqueta o nota en una posición elegida dentro de un gráfico de Matplotlib. La función recibe las coordenadas x e y, seguidas de la cadena que se mostrará; los argumentos opcionales permiten controlar el aspecto del texto. Por ejemplo, plt.text(2, 20, "Peak point") coloca una etiqueta en la coordenada de datos (2, 20). Si usas un objeto de ejes, puedes hacer la llamada equivalente ax.text(2, 20, "Peak point"). Consulta la referencia de la API de pyplot.text() para ver la lista completa de parámetros.

Usa matplotlib.pyplot.text() para añadir texto a un gráfico

El siguiente ejemplo dibuja una línea y coloca una etiqueta en uno de sus puntos de datos. Usa la interfaz de pyplot y establece el rango mostrado para que las coordenadas elegidas queden dentro del gráfico.

import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [10, 15, 25, 30]

plt.plot(x, y, marker="o")
plt.xlim(0, 5)
plt.ylim(0, 35)
plt.text(3, 25, "Peak point", fontsize=12, color="crimson")
plt.title("A labeled line plot")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()

x e y contienen los datos representados, y la llamada coloca “Peak point” en la coordenada (3, 25). Las dos llamadas a los límites incluyen esa coordenada en el rango visible. La etiqueta del ejemplo aparece en inglés. En los scripts que crean varios gráficos, ax.text(x, y, label) asocia el texto a unos ejes concretos y deja claro a qué gráfico pertenece. La llamada de pyplot resulta práctica para un único gráfico activo.

Coloca texto con coordenadas de datos y límites de los ejes

De forma predeterminada, los argumentos x e y de text() usan coordenadas de datos. Por tanto, una etiqueta en (3, 25) sigue esos valores en el gráfico; su posición no se define por la distancia en píxeles desde una esquina. Los límites actuales de x e y determinan qué parte del plano de coordenadas de datos queda visible. Si la posición indicada queda fuera de esos límites, el texto estará fuera del área visible del gráfico. Establece límites adecuados con plt.xlim() y plt.ylim(), o usa ax.set_xlim() y ax.set_ylim() con un objeto de ejes.

Elige una posición que mantenga la etiqueta legible y no cubra datos importantes. Si quieres que una nota permanezca en una fracción fija de los ejes, independientemente de los valores de los datos, usa coordenadas de ejes mediante transform=ax.transAxes; (0, 0) corresponde a la esquina inferior izquierda y (1, 1), a la superior derecha de los ejes. Esto difiere de las coordenadas de datos predeterminadas y resulta útil para fijar títulos o notas dentro del gráfico.

Personaliza el aspecto del texto

Pasa argumentos con nombre a text() para dar estilo a una etiqueta. fontsize cambia su tamaño, color define el color y fontweight="bold" resalta el texto. Usa rotation para girarlo y horizontalalignment (o ha) y verticalalignment (o va) para alinearlo con respecto a sus coordenadas x e y. Por ejemplo, ha="center" y va="bottom" centran una etiqueta sobre un punto y la mantienen por encima de este.

El argumento bbox añade un fondo detrás del texto, lo que puede separar la etiqueta de una línea o un marcador con muchos detalles. Acepta un diccionario de propiedades del recuadro. Este ejemplo breve combina alineación, énfasis, rotación y un recuadro blanco translúcido:

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([1, 2, 3], [2, 4, 3], marker="o")
ax.text(2, 4, "Peak", fontsize=12, color="crimson", fontweight="bold",
        ha="center", va="bottom", rotation=15,
        bbox={"facecolor": "white", "alpha": 0.8})
plt.close(fig)

Por ejemplo, bbox={"facecolor": "white", "alpha": 0.8} crea un fondo blanco parcialmente transparente. Usa solo las opciones que mejoren la legibilidad; si se aplican de forma generalizada, los colores intensos, las fuentes grandes o la rotación pueden distraer de los datos.

Añade anotaciones y texto en varias líneas

Usa plt.annotate() cuando una nota deba señalar un elemento. El argumento xy identifica el punto de datos descrito, mientras que xytext indica la posición del texto. Por ejemplo, plt.annotate("Peak", xy=(3, 25), xytext=(2, 30), arrowprops={"arrowstyle": "->"}) coloca una nota encima del punto y dibuja una flecha hacia él. De forma predeterminada, la posición del texto de la anotación también usa coordenadas de datos; establece límites que incluyan tanto el punto señalado como la nota. Si trabajas con ejes, usa ax.annotate() para que el punto y la nota pertenezcan al gráfico deseado.

Para escribir una nota en varias líneas, incluye caracteres de salto de línea en la cadena que pasas a text(), por ejemplo, "First line\nSecond line". Matplotlib muestra cada segmento en una línea distinta en la posición elegida. Una etiqueta de varias líneas sirve para añadir una explicación breve; ajusta su posición y alineación para que permanezca dentro del área visible del gráfico y no oculte los datos cercanos. Así puedes añadir etiquetas, contexto e indicaciones, manteniendo cada nota vinculada a las coordenadas o al elemento que describe.