Cómo agregar un título a cada subparcela

4 minutos de lectura

Avatar de usuario de Shailen
Shailen

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.suptitle agrega 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 sobre set_title(). Gracias Rutger Kassies

Avatar de usuario de Jarad
Jarad

ax.title.set_text('My Plot Title') parece funcionar también.

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 agregar títulos en subparcelas

  • Para cualquiera que tenga problemas con el tamaño de fuente para un histograma, aunque parezca extraño, reducir el número de contenedores me permite aumentarlo. Pasó de 500 a 100.

    – mlestudiante33

    19 de febrero de 2020 a las 8:56

  • Si necesita poder especificar el tamaño de fuente, use ax.set_title('title', fontsize=16) en cambio.

    – Tobías PG

    19 de junio de 2020 a las 14:56

  • @TobiasP.G., ¿cómo colocas el título dentro de la trama secundaria?

    – Hitanshu Sachania

    17 de noviembre de 2020 a las 17:52

  • Hola @Jarad, gracias por tu respuesta. En ese momento, usé ax2.text() porque ax2.title.set_y() no estaba funcionando de alguna manera. Dadas 4 subparcelas del mismo tamaño, si doy un valor de $0.9$ por $y$ a cada subparcela axis.title.set_y()todavía colocaba los títulos en lugares extraños y no coincidía con cada subtrama.

    – Hitanshu Sachania

    25 de mayo de 2021 a las 11:38

avatar de usuario de masteusz
masteusz

ax.set_title() debe establecer los títulos para subparcelas 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 comprobar si este código te funciona? ¿Quizás algo los sobrescribe más tarde?

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

    – NombreDeLaRose

    14 oct 2019 a las 6:50

  • En matplotlib 3.5.2, esto arroja un ValueError en plt.subplot(“211”) / plt.subplot(“212”) . La solución es simplemente reemplazar con argumentos enteros, plt.subplot(211) y plt.subplot(212).

    – Giorgos Sfikas

    9 de mayo a las 9:46

Avatar de usuario de JMDE
JMDE

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.

  • este enfoque es bueno porque da más control sobre la posición del título… por ejemplo, al agregar kwarg y=0.7 puede trazar el título de la subtrama dentro de la subtrama

    – CreekGeek

    25 de agosto de 2020 a las 5:25

SAGET Avatar de usuario de Shinji
SAGET Shinji

Si quieres hacerlo más corto, puedes escribir:

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

Tal vez lo hace menos claro, pero no necesita más líneas o variables

Una solución que tiendo a 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 principal
  3. asigna el título al objeto-eje actual

Avatar de usuario de Derlin
Derlin

En caso de que tenga varias imágenes y quiera 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 No.2)
  4. set_title se puede usar para establecer el título, una vez que se seleccionan los ejes (ax) o la subparcela 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))

Avatar de usuario de Wojciech Moszczyński
Wojciech Moszczyński

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í

¿Ha sido útil esta solución?