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

144

Я пытаюсь построить две отдельные величины на одном графике, используя 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, поэтому он едва читается (я хотел опубликовать здесь пример изображения, но у меня нет достаточно высокое повторение).

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

Magic_Matt_Man
источник
1
Добро пожаловать в Stack Overflow! Если вы сделаете ссылку на публикацию своего изображения на imgur, пользователь с более высоким уровнем репутации вставит изображение в ваш пост за вас.
изменено
@Magic - Не могли бы вы пересмотреть, какой ответ принять на этот вопрос? Matplotlib добавил встроенный механизм для удовлетворения этой конкретной потребности (наиболее популярный ответ ниже)
Амелио Васкес-Рейна

Ответы:

253

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

plt.title(figure_title, y=1.08)

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

Herrlich10
источник
6
Для меток вы можете установить аргумент labelpad, см. Здесь .
Феликс Хоффманн
1
Как бы то ни было, это не новая функция. titleпринимал xи yаргументировал очень давно (сколько себя помню, во всяком случае).
Джо Кингтон
3
plt.set_title ('title string', y = 1.08) у меня работает.
Юй Шен
3
Было бы более полезно, если бы кто-нибудь объяснил, что такое 1.08 и каковы значения по умолчанию.
kon
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
Я нашел обходной путь при использовании tight_layout, по крайней мере, когда вы сохраняете график с помощью figure.savefig () . Если title = plt.title(...)тогда вы можете указать, чтобы сюжет был плотно обрамлен вокруг заголовка, используя опцию bbox_extra_artists:figure.savefig(filename, bbox_extra_artists=(title), bbox_inches='tight')
junkaholik
9
ax.set_title('My Title\n', fontsize="15", color="red")
plt.imshow(myfile, origin="upper")

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

Эфкан
источник
8

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

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

перед

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

после

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

Справка:

Jmunsch
источник
4

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

Питер Чжу
источник
4

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

ax.set_title("whatever", pad=20)
Радвин
источник