Как добавить заголовок к подзаголовкам в Matplotlib?

У меня есть одна фигура, которая содержит множество сюжетных линий.

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) 

Как мне добавить заголовки к подсюжетам?

fig.suptitle добавляет заголовок ко всем графикам, и хотя ax.set_title() существует, последний не добавляет заголовок к моим частям.

Спасибо за помощь.

Изменить: исправлена ​​опечатка о set_title(). Спасибо, Рутгер Кэссис


person Shailen    schedule 11.08.2014    source источник


Ответы (8)


ax.title.set_text('My Plot Title') вроде тоже работает.

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 добавить заголовки на  subplots

person Jarad    schedule 24.08.2016
comment
Для тех, у кого есть проблемы с размером шрифта для гистограммы, как ни странно, уменьшение количества ячеек позволило мне увеличить его. Пошел с 500 до 100. - person mLstudent33; 19.02.2020
comment
Если вам нужно указать размер шрифта, используйте вместо этого ax.set_title('title', fontsize=16). - person Tobias P. G.; 19.06.2020
comment
@ TobiasP.G., Как вы позиционируете заголовок внутри подсюжета? - person Hitanshu Sachania; 17.11.2020
comment
@HitanshuSachania, например, ax2, вы можете использовать ax2.title.set_y(0.8), и это переместит заголовок вниз. Если вы видите, что заголовки перекрывают другие графики, вы можете поместить plt.tight_layout() прямо перед plt.show() и посмотреть, поможет ли это. - person Jarad; 24.05.2021
comment
Привет, @Jarad, спасибо за ответ. В то время я использовал ax2.text(), потому что ax2.title.set_y() почему-то не работал. Учитывая 4 подзаголовка одинакового размера, если бы я дал значение $ 0,9 $ для $ y $ каждому подзаголовку axis.title.set_y(), заголовки по-прежнему располагались бы в странных местах и ​​не совпадали для каждого подзаголовка. - person Hitanshu Sachania; 25.05.2021

ax.set_title() следует установить заголовки для отдельных подсюжетов:

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()

Можете ли вы проверить, работает ли этот код у вас? Может, их потом что-то затирает?

person masteusz    schedule 11.08.2014
comment
Это работает для меня, matplotlib версии 1.2.2 python 2.7.5 - person NameOfTheRose; 14.10.2019

Сокращенный ответ, предполагающий import matplotlib.pyplot as plt:

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

as in:

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

Тогда нет необходимости в лишних переменных.

person JMDE    schedule 15.12.2017
comment
этот подход хорош, потому что он дает больший контроль над положением заголовка ... например. добавив kwarg y = 0,7, вы можете построить заголовок подзаговора внутри подзаговора - person CreekGeek; 25.08.2020

Если вы хотите сделать его короче, вы можете написать:

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()

Возможно, это делает его менее понятным, но вам не нужно больше строк или переменных

person SAGET Shinji    schedule 04.12.2018

Решение, которое я использую все чаще и чаще, таково:

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. Создайте произвольное количество осей
  2. axs.ravel () преобразует ваш двухмерный объект в одномерный вектор в строчном стиле
  3. присваивает заголовок текущему объекту оси
person JMDE    schedule 18.06.2020

Если у вас есть несколько изображений, и вы хотите просмотреть их в цикле и показать их 1 на 1 вместе с заголовками - это то, что вы можете сделать. Нет необходимости явно определять ax1, ax2 и т. Д.

  1. Уловка заключается в том, что вы можете определить динамические оси (ax), как в строке 1 кода, и вы можете установить его заголовок внутри цикла.
  2. Строки 2D-массива имеют длину (len) оси (ax)
  3. В каждой строке по 2 элемента, т.е. это список в списке (пункт 2).
  4. set_title может использоваться для установки заголовка, как только выбрана правильная ось (топор) или подзаговор.
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))
person rishi jain    schedule 01.11.2019

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()

введите здесь описание изображения

person Wojciech Moszczyński    schedule 20.05.2020

Вы можете дать каждому графику другое название и метку только по итерации.

titles = {221: 'First Plot', 222: 'Second Plot', 223: 'Third Plot', 224: 'Fourth Plot'}
fig = plt.figure()
for x in range(221,225):
  ax = fig.add_subplot(x)
  ax.title.set_text(titles.get(x))

plt.subplots_adjust(left=0.1,
                    bottom=0.1, 
                    right=0.9, 
                    top=0.9, 
                    wspace=0.4, 
                    hspace=0.4)
plt.show()

Выход:

введите описание изображения здесь

person MRUNAL MUNOT    schedule 28.06.2021