Заглавието на фигурата на 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 Съгласен съм, по подразбиране всъщност е 0 според документи за текстови обекти но не съм сигурен какви са единиците. - 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 Това е в изходния код на _AxesBase клас. Потърсете 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