Заголовок рисунка Python Matplotlib перекрывает метку осей при использовании twiny

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

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

и данные представлены нормально, но у меня проблема в том, что заголовок рисунка перекрывается с метками осей на вторичной оси x, поэтому он едва читается (я хотел опубликовать здесь пример изображения, но у меня нет достаточно много повторений).

Я хотел бы знать, есть ли простой способ просто сместить заголовок на несколько десятков пикселей вверх, чтобы диаграмма выглядела красивее.


person Magic_Matt_Man    schedule 05.10.2012    source источник
comment
Добро пожаловать в Stack Overflow! Если вы сделаете ссылку на публикацию своего изображения на imgur, пользователь с более высокой репутацией встроит изображение в ваш пост за вас.   -  person Hooked    schedule 05.10.2012
comment
@Magic - Не могли бы вы пересмотреть, какой ответ принять на этот вопрос? Matplotlib добавил встроенный механизм для обработки этой точной потребности (ответ с наибольшим количеством голосов ниже)   -  person Amelio Vazquez-Reina    schedule 25.11.2014


Ответы (7)


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

plt.title(figure_title, y=1.08)

Это также работает для plt.suptitle(), но (пока) не для plt.xlabel() и т. Д.

person herrlich10    schedule 28.04.2014
comment
Для ярлыков вы можете установить аргумент labelpad, см. здесь. - person Felix Hoffmann; 02.05.2014
comment
Как бы то ни было, это не новая функция. title принимал x и y аргументы в течение очень долгого времени (насколько я себя помню, во всяком случае). - person Joe Kington; 27.09.2014
comment
plt.set_title ('title string', y = 1.08) у меня работает. - person Yu Shen; 23.12.2014
comment
Было бы более полезно, если бы кто-нибудь объяснил, что такое 1.08 и каковы значения по умолчанию. Насколько я понимаю, по умолчанию 1 - person kon psych; 02.08.2017
comment
@konpsych Я согласен, в соответствии с документами текстовых объектов но я не уверен, что это за единицы. - person John Cummings; 12.10.2017
comment
@JohnCummings Кажется, что значение по умолчанию y = 1, а единицы измерения - это доли осей, то есть y = 0,5 означает, что заголовок находится в середине осей, а y = 0 означает, что заголовок находится чуть выше нижней части осей . - person herrlich10; 19.10.2017
comment
@ herrlich10 спасибо за информацию о единицах - где вы нашли эту деталь? Кроме того, единственное значение по умолчанию, которое я вижу для y, - это y=0 в документах по текстовым объектам, с которыми я связался. Где вы нашли y=1 в качестве значения по умолчанию? - person John Cummings; 20.10.2017
comment
@JohnCummings Это в исходном коде _1 _ класс. Найдите в файле self.title. - person herrlich10; 22.10.2017
comment
Это работает и при итерации по осям. - person Henrik; 20.06.2021

Забудьте об использовании 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()

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

person Hooked    schedule 05.10.2012
comment
@ user815423426 да, tight_layout по-прежнему не очень хорошо работает с нестандартными размещениями. Может быть, вы могли бы сообщить об ошибке? - person Hooked; 10.04.2014
comment
Я нашел обходной путь при использовании tight_layout, по крайней мере, когда вы сохраняете свой график с помощью figure.savefig (). Если title = plt.title(...), вы можете указать, чтобы сюжет был плотно обрамлен вокруг заголовка, используя параметр bbox_extra_artists: figure.savefig(filename, bbox_extra_artists=(title), bbox_inches='tight') - person junkaholik; 09.04.2015

У меня была проблема с x-меткой, перекрывающей заголовок подзаговора; это сработало для меня:

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

до

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

после

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

ссылка:

person jmunsch    schedule 05.07.2018

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

Если вы поместите '\n' сразу после строки заголовка, график будет нарисован сразу под заголовком. Это тоже может быть быстрым решением.

person Efkan    schedule 29.09.2017

В этом случае можно использовать площадку:

ax.set_title("whatever", pad=20)
person Radvin    schedule 27.03.2020

Просто используйте plt.tight_layout() перед plt.show(). Это работает хорошо.

person Peter Zhu    schedule 24.08.2018

Временное решение, если вы не хотите попадать в x, y позицию вашего заголовка.

Следующее сработало для меня.

plt.title('Capital Expenditure\n') # Add a next line after your title

Престижность.

person Anupam Kumar    schedule 06.02.2021