Подтвердить что ты не робот

GridSpec с общими осями в Python

Это решение в другой поток предлагает использовать gridspec.GridSpec вместо plt.subplots. Однако, когда я разделяю оси между подзаголовками, я обычно использую синтаксис, например, следующий

  fig, axes = plt.subplots(N, 1, sharex='col', sharey=True, figsize=(3,18))

Как я могу указать sharex и sharey, когда я использую GridSpec?

4b9b3361

Ответ 1

Прежде всего, есть более легкое обходное решение для вашей исходной проблемы, если вы в порядке, слегка неточным. Просто reset верхняя часть подзаголовков по умолчанию после вызова tight_layout:

fig, axes = plt.subplots(ncols=2, sharey=True)
plt.setp(axes, title='Test')
fig.suptitle('An overall title', size=20)

fig.tight_layout()
fig.subplots_adjust(top=0.9) 

plt.show()

enter image description here


Однако, чтобы ответить на ваш вопрос, вам нужно создать подзаголовки на чуть более низком уровне, чтобы использовать gridspec. Если вы хотите реплицировать сглаживание общих осей, например, subplots, вам нужно сделать это вручную, используя аргумент sharey для Figure.add_subplot. и спрятать дублированные тики с помощью plt.setp(ax.get_yticklabels(), visible=False).

В качестве примера:

import matplotlib.pyplot as plt
from matplotlib import gridspec

fig = plt.figure()
gs = gridspec.GridSpec(1,2)
ax1 = fig.add_subplot(gs[0])
ax2 = fig.add_subplot(gs[1], sharey=ax1)
plt.setp(ax2.get_yticklabels(), visible=False)

plt.setp([ax1, ax2], title='Test')
fig.suptitle('An overall title', size=20)
gs.tight_layout(fig, rect=[0, 0, 1, 0.97])

plt.show()

enter image description here

Ответ 2

Оба варианта Joe дали мне некоторые проблемы: первый, связанный с прямым использованием figure.tight_layout вместо figure.set_tight_layout(), а второй - с некоторыми бэкэндами (UserWarning: tight_layout: возврат к агрингу Agg). Но Джо ответ определенно прояснил мой путь к другой компактной альтернативе. Это результат проблемы, близкой к OP:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=2, ncols=1, sharex='col', sharey=True,
                               gridspec_kw={'height_ratios': [2, 1]},
                               figsize=(4, 7))
fig.set_tight_layout({'rect': [0, 0, 1, 0.95], 'pad': 1.5, 'h_pad': 1.5})
plt.setp(axes, title='Test')
fig.suptitle('An overall title', size=20)

plt.show()

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