Назва малюнка Python Matplotlib перекриває мітку осей при використанні мініатюр


139

Я намагаюся побудувати дві окремі величини на одному графіку за допомогою мініатюр:

fig = figure()
ax = fig.add_subplot(111)
ax.plot(T, r, 'b-', T, R, 'r-', T, r_geo, 'g-')
ax.set_yscale('log')
ax.annotate('Approx. sea level', xy=(Planet.T_day*1.3,(Planet.R)/1000), xytext=(Planet.T_day*1.3, Planet.R/1000))
ax.annotate('Geostat. orbit', xy=(Planet.T_day*1.3, r_geo[0]), xytext=(Planet.T_day*1.3, r_geo[0]))
ax.set_xlabel('Rotational period (hrs)')
ax.set_ylabel('Orbital radius (km), logarithmic')
ax.set_title('Orbital charts for ' + Planet.N, horizontalalignment='center', verticalalignment='top')


ax2 = ax.twiny()
ax2.plot(v,r,'k-')
ax2.set_xlabel('Linear speed (ms-1)')

show()

і дані представлені прекрасно, але у мене виникає проблема, що назва фігури перекривається мітками осей на вторинній осі х, щоб вона була ледь розбірливою (я хотів розмістити тут приклад зображення, але у мене немає ще досить високий реп).

Мені хотілося б знати, чи існує прямий спосіб просто перенести заголовок прямо на кілька десятків пікселів, щоб діаграма виглядала красивіше.


1
Ласкаво просимо до переповнення стека! Якщо ви посилаєтесь на незрозуміле розміщення вашої фотографії, вищий представник реп-версії вбудує зображення у вашу посаду для вас.
Зачепили

@Magic - Ви б переглянули, яку відповідь прийняти на це питання? Matplotlib додав вбудований механізм, щоб вирішити цю точну потребу (найбільш проголосовану відповідь нижче)
Амеліо Васкес-Рейна

Відповіді:


243

Я не впевнений, чи це нова функція в пізніших версіях matplotlib, але принаймні для 1.3.1 це просто:

plt.title(figure_title, y=1.08)

Це також працює для plt.suptitle(), але не (ще) для plt.xlabel()тощо.


6
Для міток можна встановити аргумент labelpad, дивіться тут .
Фелікс Гофман

1
Що це варто, це не нова функція. titleбрав xі yміркував дуже давно (наскільки я пам'ятаю, у будь-якому разі).
Джо Кінгтон

3
plt.set_title ('рядок заголовка', y = 1,08) працює для мене.
Ю. Шень

3
Було б корисніше, якби хтось пояснив, що таке одиниці 1,08, а які - за замовчуванням. Я розумію, що за замовчуванням є 1
кон псих

3
@JohnCummings Здається, що значення за замовчуванням - y = 1, а одиниці - "частка осей", тобто y = 0,5 означає, що заголовок знаходиться в середині осей, а y = 0 означає, що заголовок знаходиться вище нижньої частини осей.
herrlich10

33

Забудьте про використання plt.titleта розміщення тексту безпосередньо plt.text. Нижче наведено перебільшений приклад:

import pylab as plt

fig = plt.figure(figsize=(5,10))

figure_title = "Normal title"
ax1  = plt.subplot(1,2,1)

plt.title(figure_title, fontsize = 20)
plt.plot([1,2,3],[1,4,9])

figure_title = "Raised title"
ax2  = plt.subplot(1,2,2)

plt.text(0.5, 1.08, figure_title,
         horizontalalignment='center',
         fontsize=20,
         transform = ax2.transAxes)
plt.plot([1,2,3],[1,4,9])

plt.show()

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


@ user815423426 так, tight_layoutвсе ще, здається, не дуже добре грати з нестандартними місцями розташування. Можливо, ви могли б скласти звіт про помилку?
Зачепили

2
Я знайшов собі проблему, коли використовував затягуючий_лаут, принаймні, коли ви зберігаєте свою ділянку за допомогою figure.savefig () . Якщо title = plt.title(...)тоді ви можете вказати, щоб чітко bbox_extra_artistsfigure.savefig(filename, bbox_extra_artists=(title), bbox_inches='tight')
обрамляти

10
ax.set_title('My Title\n', fontsize="15", color="red")
plt.imshow(myfile, origin="upper")

Якщо ви ставите '\n'відразу після рядка заголовка, графік малюється трохи нижче заголовка. Це теж може бути швидким рішенням.


8

У мене виникла проблема з x-label, що перекриває назву subplot; це працювало для мене:

import matplotlib.pyplot as plt
fig, ax = plt.subplots(2, 1)
ax[0].scatter(...)
ax[1].scatter(...)
plt.tight_layout()
.
.
.
plt.show()

раніше

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

після

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

довідка:



4

Ви можете використовувати килимок для цього випадку:

ax.set_title("whatever", pad=20)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.