¿Cómo agregar título a subtramas en Matplotlib?


225

Tengo una figura que contiene muchas subtramas.

fig = plt.figure(num=None, figsize=(26, 12), dpi=80, facecolor='w', edgecolor='k')
fig.canvas.set_window_title('Window Title')

# Returns the Axes instance
ax = fig.add_subplot(311) 
ax2 = fig.add_subplot(312) 
ax3 = fig.add_subplot(313) 

¿Cómo agrego títulos a las subtramas?

fig.suptitleagrega un título a todos los gráficos y, aunque ax.set_title()existe, este último no agrega ningún título a mis subtramas.

Gracias por tu ayuda.

Editar: error tipográfico corregido set_title(). Gracias Rutger Kassies

Respuestas:


201

ax.title.set_text('My Plot Title') Parece que también funciona.

fig = plt.figure()
ax1 = fig.add_subplot(221)
ax2 = fig.add_subplot(222)
ax3 = fig.add_subplot(223)
ax4 = fig.add_subplot(224)
ax1.title.set_text('First Plot')
ax2.title.set_text('Second Plot')
ax3.title.set_text('Third Plot')
ax4.title.set_text('Fourth Plot')
plt.show()

matplotlib agrega títulos en subtramas


Para cualquiera que tenga problemas con el tamaño de fuente para un histograma, por extraño que parezca, reducir el número de bins me permite aumentarlo. Fue de 500 a 100.
mLstudent33

Si necesita poder especificar el tamaño de fuente, use ax.set_title('title', fontsize=16)en su lugar.
Tobias PG

234

ax.set_title() debería establecer los títulos para subtramas separadas:

import matplotlib.pyplot as plt

if __name__ == "__main__":
    data = [1, 2, 3, 4, 5]

    fig = plt.figure()
    fig.suptitle("Title for whole figure", fontsize=16)
    ax = plt.subplot("211")
    ax.set_title("Title for first plot")
    ax.plot(data)

    ax = plt.subplot("212")
    ax.set_title("Title for second plot")
    ax.plot(data)

    plt.show()

¿Puedes verificar si este código te funciona? ¿Quizás algo los sobrescribe más tarde?


1
Esto funciona para mí, matplotlib versión 1.2.2 python
2.7.5

41

Una respuesta abreviada asumiendo import matplotlib.pyplot as plt:

plt.gca().set_title('title')

como en:

plt.subplot(221)
plt.gca().set_title('title')
plt.subplot(222)
etc...

Entonces no hay necesidad de variables superfluas.


8

Si quieres acortarlo, puedes escribir:

import matplolib.pyplot as plt
for i in range(4):
    plt.subplot(2,2,i+1).set_title('Subplot n°{}' .format(i+1))
plt.show()

Puede que sea menos claro, pero no necesita más líneas o variables.


1

En caso de que tenga varias imágenes y desee recorrerlas y mostrarlas 1 por 1 junto con los títulos, esto es lo que puede hacer. No es necesario definir explícitamente ax1, ax2, etc.

  1. El problema es que puede definir ejes dinámicos (ax) como en la Línea 1 del código y puede establecer su título dentro de un bucle.
  2. Las filas de la matriz 2D son la longitud (len) del eje (ax)
  3. Cada fila tiene 2 elementos, es decir, es una lista dentro de una lista (Punto 2)
  4. set_title se puede usar para establecer el título, una vez que se seleccionan los ejes (ax) o la subtrama adecuados.
import matplotlib.pyplot as plt    
fig, ax = plt.subplots(2, 2, figsize=(6, 8))  
for i in range(len(ax)): 
    for j in range(len(ax[i])):
        ## ax[i,j].imshow(test_images_gr[0].reshape(28,28))
        ax[i,j].set_title('Title-' + str(i) + str(j))

1
fig, (ax1, ax2, ax3, ax4) = plt.subplots(nrows=1, ncols=4,figsize=(11, 7))

grid = plt.GridSpec(2, 2, wspace=0.2, hspace=0.5)

ax1 = plt.subplot(grid[0, 0])
ax2 = plt.subplot(grid[0, 1:])
ax3 = plt.subplot(grid[1, :1])
ax4 = plt.subplot(grid[1, 1:])

ax1.title.set_text('First Plot')
ax2.title.set_text('Second Plot')
ax3.title.set_text('Third Plot')
ax4.title.set_text('Fourth Plot')

plt.show()

ingrese la descripción de la imagen aquí


0

Una solución que suelo usar cada vez más es esta:

import matplotlib.pyplot as plt

fig, axs = plt.subplots(2, 2)  # 1
for i, ax in enumerate(axs.ravel()): # 2
    ax.set_title("Plot #{}".format(i)) # 3
  1. Crea tu número arbitrario de ejes
  2. axs.ravel () convierte su objeto de 2 dim en un vector de 1 dim en estilo de fila mayor
  3. asigna el título al eje-objeto actual
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.