Одна вещь, которую вы можете очень легко изменить в своем коде - это fontsize
, которую вы используете для названий. Тем не менее, я предполагаю, что вы не просто хотите это сделать!
Некоторые альтернативы использованию fig.subplots_adjust(top=0.85)
:
Обычно tight_layout()
неплохо справляется с позиционированием всего в хороших местах, чтобы они не перекрывались. Причина, по которой tight_layout()
не помогает в этом случае, заключается в том, что tight_layout()
не учитывает fig.suptitle (). Существует открытая проблема по этому поводу на GitHub: https://github.com/matplotlib/matplotlib/issues/829 [закрыто в 2014 году из-за необходимости полного менеджера геометрии - смещено на https://github.com/matplotlib/matplotlib/issues/1109].
Если вы читаете ветку, есть решение вашей проблемы, включающее GridSpec
. Ключ в том, чтобы при вызове tight_layout
, используя kwarg rect
, оставить место в верхней части фигуры. Для вашей проблемы код становится:
Использование 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'
, чтобы имитировать 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]