У меня есть очень красивый график GridSpec с использованием Matplotlib 2.2.2, но я не могу сделать красивое название для рисунка в целом. Пример:
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np
%matplotlib inline
def example(tl):
fig = plt.figure(figsize=(14,8))
hr = [3,3,3,1,1]
wr = [3,1]
ny = len(hr)
nx = len(wr)
gs = gridspec.GridSpec(ny,nx,
height_ratios=hr,
width_ratios=wr,
hspace=0.08, wspace=0.1)
for j in xrange(nx):
ax = [fig.add_subplot(gs[0,j])]
ax += [fig.add_subplot(gs[i,j], sharex=ax[0]) for i in xrange(1,ny)]
for axi in ax:
axi.plot([0,1,2],[0,1,4])
fig.suptitle('The quick brown fox jumps over the lazy dog.')
if tl:
gs.tight_layout(fig)
Если я запускаю example(False) без плотной компоновки, я получаю огромное пространство над рисунками:
Если я запускаю example(True) для плотного макета, я получаю отрицательное пространство:
Как я могу это исправить и получить заголовок на уровне рисунка с надлежащим запасом на подзаголовках?
@KhalilAlHooti не могли бы вы опубликовать ответ?






tight_layout() не принимает во внимание художников уровня рисунка.
Однако есть относительно новая альтернатива, называемая constrained_layout. Используя это, будет включено название рисунка. Обратите внимание, что для того, чтобы это сработало, вам необходимо передать цифру в GridSpec через его аргумент figure.
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
def example(tl):
fig = plt.figure(figsize=(14,8), constrained_layout=tl)
hr = [3,3,3,1,1]
wr = [3,1]
ny = len(hr)
nx = len(wr)
gs = gridspec.GridSpec(ny,nx, figure=fig,
height_ratios=hr,
width_ratios=wr,
hspace=0.08, wspace=0.1)
for j in range(nx):
ax = [fig.add_subplot(gs[0,j])]
ax += [fig.add_subplot(gs[i,j], sharex=ax[0]) for i in range(1,ny)]
for axi in ax:
axi.plot([0,1,2],[0,1,4])
fig.suptitle('The quick brown fox jumps over the lazy dog.')
example(True)
plt.show()
В качестве альтернативы вы можете обновить верхнее поле после, вызвав tight_layout. Например. в виде
gs.update(top=0.95)
Код:
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
def example(tl):
fig = plt.figure(figsize=(14,8))
hr = [3,3,3,1,1]
wr = [3,1]
ny = len(hr)
nx = len(wr)
gs = gridspec.GridSpec(ny,nx, figure=fig,
height_ratios=hr,
width_ratios=wr,
hspace=0.08, wspace=0.1)
for j in range(nx):
ax = [fig.add_subplot(gs[0,j])]
ax += [fig.add_subplot(gs[i,j], sharex=ax[0]) for i in range(1,ny)]
for axi in ax:
axi.plot([0,1,2],[0,1,4])
fig.suptitle('The quick brown fox jumps over the lazy dog.')
if tl:
gs.tight_layout(fig)
gs.update(top=0.95)
example(True)
plt.show()
вы можете установить расположение
xиyдляsuptitleс дополнительным аргументом, например. цвет шрифта, размер шрифта и т. д. matplotlib.org/api/_as_gen/matplotlib.pyplot.suptitle.html. вероятно,y=0.91- лучшее место, чем значение по умолчанию 0,98