Matplotlib tight_layout + gridspec + fig.suptitle выглядит плохо

У меня есть очень красивый график 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) без плотной компоновки, я получаю огромное пространство над рисунками:

Matplotlib tight_layout + gridspec + fig.suptitle выглядит плохо

Если я запускаю example(True) для плотного макета, я получаю отрицательное пространство:

Matplotlib tight_layout + gridspec + fig.suptitle выглядит плохо

Как я могу это исправить и получить заголовок на уровне рисунка с надлежащим запасом на подзаголовках?

вы можете установить расположение x и y для suptitle с дополнительным аргументом, например. цвет шрифта, размер шрифта и т. д. matplotlib.org/api/_as_gen/matplotlib.pyplot.suptitle.html. вероятно, y=0.91 - лучшее место, чем значение по умолчанию 0,98

Khalil Al Hooti 06.12.2018 00:14

@KhalilAlHooti не могли бы вы опубликовать ответ?

Jason S 10.12.2018 21:43
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
2 174
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

tight_layout() не принимает во внимание художников уровня рисунка.

Используйте constrained_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()

Другие вопросы по теме