Textos y anotaciones en matplotlib

Agregar textos en matplotlib con text y figtext

Es posible agregar textos sobre los gráficos de matplotlib utilizando las funciones text y figtext. La principal diferencia entre estas dos funciones es que la primera se utiliza para agregar textos dentro del gráfico mientras que la segunda se puede utilizar para agregar textos a la figura.

Agregar un texto

La función text necesita al menos tres parámetros: las coordenadas (x, y) y el texto deseado, como se muestra en el ejemplo siguiente.

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot(np.sin(np.linspace(0, 10)))
plt.text(20, 0.5, 'Texto') # Coordenadas y texto

# plt.show()

La función text en matplotlib

Posición en base a los ejes

Una alternativa a posicionar los textos por coordenadas es posicionar los textos de manera relativa a los ejes en escala 0 a 1 con transform = ax.transAxes.

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot(np.sin(np.linspace(0, 10)))
plt.text(0.5, 0.5, 'Centro', transform = ax.transAxes)
plt.text(0.05, 0.05, 'Abajo-izquierda', transform = ax.transAxes)
plt.text(0.8, 0.85, 'Arriba-derecha', transform = ax.transAxes)
plt.text(0.8, 0.05, 'Abajo-derecha', transform = ax.transAxes)
plt.text(0.05, 0.85, 'Arriba-izquierda', transform = ax.transAxes)

# plt.show()

Posición de los textos de un gráfico de Python en matplotlib

En las siguientes subsecciones se muestran algunas de las personalizaciones más habituales, pero recuerda leer la documentación de la función para obtener información sobre ajustes más avanzados.

Color

Con el argumento color se puede cambiar el color por defecto pasando el color deseado.

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot(np.sin(np.linspace(0, 10)))
plt.text(20, 0.5, 'Texto', color = "green")

# plt.show()

Cambiar el color de una anotación de texto en matplotlib

Tamaño de la fuente

Si la letra es demasiado grande o demasiado pequeña se puede ajustar el tamaño con el argumento fontsize.

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot(np.sin(np.linspace(0, 10)))
plt.text(20, 0.5, 'Texto', fontsize = 16)

# plt.show()

Tamaño de fuente de una anotación de texto en un gráfico de matplotlib

Alineación del texto

La función text permite ajustar la alineación tanto vertical como horizontalmente con los argumentos verticalalignment o va (que puede tomar los valores 'center', 'top', 'bottom', 'baseline' o 'center_baseline') y horizontalalignment o ha (que puede tomar los valores 'center', 'right' o 'left'), respectivamente.

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot(np.sin(np.linspace(0, 10)))
plt.text(20, 0.5, 'Texto', 
         verticalalignment = 'bottom',
         horizontalalignment = 'right')

# plt.show()

Alineación de los textos en matplotlib

Rotación del texto

El argumento rotation permite especificar el ángulo de inclinación del texto o establecerlo como vertical (vertical) u horizontal (horizontal).

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot(np.sin(np.linspace(0, 10)))
plt.text(20, 0.5, 'Texto', rotation = 45)

# plt.show()

Rotar un texto en matplotlib

Texto dentro de una caja

Pasando un diccionario al argumento bbox de la función text se puede crear un texto dentro de una caja, como en el ejemplo siguiente.

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot(np.sin(np.linspace(0, 10)))
plt.text(20, 0.5, 'Texto', bbox = {'facecolor': 'oldlace', 'alpha': 0.5, 'pad': 8})

# plt.show()

Agregar un texto dentro de una caja en matplotlib con la función text y bbox

Además, es posible personalizar el estilo de la caja con el elemento boxstyle del diccionario, tal y como se puede ver en el siguiente bloque de código.

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot(np.sin(np.linspace(0, 10)))
plt.text(20, 0.5, 'Texto dentro de una caja', bbox = {'facecolor': 'oldlace', 'alpha': 0.5, 'boxstyle': "rarrow,pad=0.3", 'ec': 'red'})

# plt.show()

Add a text inside an arrow in Python with matplotlib

En los ejemplos anteriores utilizamos el estilo rarrow. La imagen siguiente muestra todos los posibles estilos junto con sus parámetros por defecto.

Estilos de caja en matplotlib

Texto en una figura

Similar a la anterior función, la función figtext puede ser usada para agregar textos a la figura. Recuerda que es posible personalizar el texto de la misma manera que en la sección anterior. Lee la documentación para obtener más información.

En este ejemplo situamos el texto en la parte central superior de la figura y centramos el texto horizontalmente con el argumento ha.

import numpy as np
import matplotlib.pyplot as plt

fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.plot(np.sin(np.linspace(0, 10)))
ax2.plot(np.sin(np.linspace(0, 10)))
plt.figtext(0.5, 0.9, 'Texto de la figura', ha = "center")

# plt.show()

La función figtext en matplotlib

Anotaciones y flechas con annotate

Las anotaciones son similares a los textos, pero la función annotate proporciona argumentos adicionales para hacer anotaciones en partes específicas de un gráfico con flechas. Si no quieres utilizar flechas probablemente tu mejor opción es utilizar la función text.

Para agregar anotaciones de texto a un gráfico de matplotlib tendrás que establecer al menos, el texto, las coordenadas del gráfico que quieres destacar marcado con la flecha (xy), las coordenadas del texto (xytext) y las propiedades de la flecha (arrowprops).

La función annotate en matplotlib

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot(np.sin(np.linspace(0, 10)))
plt.annotate('Mínimo',
             xy = (23, -0.95),
             xytext = (23, 0.25),
             arrowprops = dict(facecolor = 'black', width = 0.2, headwidth = 8),
             horizontalalignment = 'center')

# plt.show()

Las coordenadas del ejemplo anterior son las coordenadas de los datos, pero la función annotate permite especificar diferentes sistemas de coordenadas, tanto para la flecha como para el texto con xycoords y textcoords, respectivamente. Las posibles opciones son 'figure points', 'figure pixels', 'figure fraction', 'axes points', 'axes pixels', 'axes fraction' y 'data', entre otras. Revisa la documentación de la función para obtener más detalles.

Flecha sin texto

Si solo quieres agregar una flecha sin texto tan solo tendrás que dejar vacío el texto y se creará únicamente la flecha.

Agregar flechas en Python con matplotlib

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot(np.sin(np.linspace(0, 10)))
plt.annotate('',
             xy = (23, -0.95),
             xytext = (23, 0.25),
             arrowprops = dict(facecolor = 'red', width = 0.4, headwidth = 8))

# plt.show()
Fundamentals of Data Visualization

A Primer on Making Informative and Compelling Figures

Comprar en Amazon

También te puede interesar