Одне, що ви можете легко змінити у своєму коді, - це fontsize
ви використовуєте для заголовків. Однак я припускаю, що ти не просто хочеш цього робити!
Деякі варіанти використання fig.subplots_adjust(top=0.85)
:
Зазвичай tight_layout()
робить досить гарну роботу з розміщенням все у хороших місцях, щоб вони не перетиналися. Причина tight_layout()
не допомагає в цьому випадку в тому, що tight_layout()
вона не враховує fig.suptitle (). Про це на GitHub існує відкрите питання: https://github.com/matplotlib/matplotlib/isissue/829 [закрито у 2014 році через необхідність повноцінного менеджера з геометрії - переведено на https://github.com/matplotlib/matplotlib / випуски / 1109 ].
Якщо ви читаєте нитку, існує вирішення проблеми, що стосується GridSpec
. Ключ - залишити трохи місця у верхній частині фігури під час дзвінка tight_layout
, використовуючи rect
kwarg. Для вашої проблеми код стає:
Використання GridSpec
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
f = np.random.random(100)
g = np.random.random(100)
fig = plt.figure(1)
gs1 = gridspec.GridSpec(1, 2)
ax_list = [fig.add_subplot(ss) for ss in gs1]
ax_list[0].plot(f)
ax_list[0].set_title('Very Long Title 1', fontsize=20)
ax_list[1].plot(g)
ax_list[1].set_title('Very Long Title 2', fontsize=20)
fig.suptitle('Long Suptitle', fontsize=24)
gs1.tight_layout(fig, rect=[0, 0.03, 1, 0.95])
plt.show()
Результат:
Можливо GridSpec
, це трохи зайве для вас, або ваша реальна проблема буде пов'язана з набагато більшою кількістю субплотів на значно більшому полотні або іншими ускладненнями. Простий хак - це просто використовувати annotate()
та заблокувати координати до, 'figure fraction'
щоб наслідувати a suptitle
. Можливо, вам знадобиться зробити дещо тонші налаштування, як тільки ви подивитесь на вихід. Зауважте, що це друге рішення не використовуєтьсяtight_layout()
.
Більш просте рішення (хоч може знадобитися точне налаштування)
fig = plt.figure(2)
ax1 = plt.subplot(121)
ax1.plot(f)
ax1.set_title('Very Long Title 1', fontsize=20)
ax2 = plt.subplot(122)
ax2.plot(g)
ax2.set_title('Very Long Title 2', fontsize=20)
# fig.suptitle('Long Suptitle', fontsize=24)
# Instead, do a hack by annotating the first axes with the desired
# string and set the positioning to 'figure fraction'.
fig.get_axes()[0].annotate('Long Suptitle', (0.5, 0.95),
xycoords='figure fraction', ha='center',
fontsize=24
)
plt.show()
Результат:
[Використовуючи Python
2.7.3 (64-розрядні) та matplotlib
1.2.0]