Если я добавлю субтитры к моей фигуре matplotlib, она будет наложена на заголовки субплота. Кто-нибудь знает, как легко позаботиться об этом? Я попробовал tight_layout()
функцию, но она только ухудшает ситуацию.
Пример:
import numpy as np
import matplotlib.pyplot as plt
f = np.random.random(100)
g = np.random.random(100)
fig = plt.figure()
fig.suptitle('Long Suptitle', fontsize=24)
plt.subplot(121)
plt.plot(f)
plt.title('Very Long Title 1', fontsize=20)
plt.subplot(122)
plt.plot(g)
plt.title('Very Long Title 2', fontsize=20)
plt.tight_layout()
plt.show()
python
matplotlib
katrasnikj
источник
источник
tight_layout
документы:[left, bottom, right, top] in normalized (0, 1) figure coordinates
tight_layout(rect=[0, 0.03, 1, 0.9])
вместо того,0.95
что указано в ответе.Вы можете вручную настроить интервал, используя
plt.subplots_adjust(top=0.85)
:источник
subplots_adjust
subplots_adjust
должен быть вызван после любых вызововtight_layout
, иначе он не будет вызыватьсяsubplots_adjust
.Одна вещь, которую вы можете очень легко изменить в своем коде, это то, что
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
, используяrect
kwarg. Для вашей проблемы код становится:Использование GridSpec
Результат:
Может быть
GridSpec
, это немного излишне для вас, или ваша настоящая проблема будет включать в себя гораздо больше вспомогательных сюжетов на гораздо большем холсте или другие сложности. Простой взлом состоит в том, чтобы просто использоватьannotate()
и зафиксировать координаты'figure fraction'
для имитацииsuptitle
. Возможно, вам придется внести некоторые более точные корректировки, как только вы посмотрите на результат. Обратите внимание, что это второе решение не используетtight_layout()
.Более простое решение (хотя может потребоваться его точная настройка)
Результат:
[Использование
Python
2.7.3 (64-разряднаяmatplotlib
версия ) и 1.2.0]источник
GridSpec
), как я могу создать вспомогательные участки, которые имеют общие оси? Я обычно используюplt.subplots(N,1, sharex=<>, sharey=<>)
при создании подзаговоров, ноadd_subplot
вместо этого используется код, который вы разместилиfig.tight_layout(rect=[0, 0.03, 1, 0.95])
тоже работает.Альтернативное и простое в использовании решение - настроить координаты текста субтитра на рисунке, используя аргумент y в вызове suptitle (см. Документацию ):
источник
Плотный макет не работает с suptitle, но
constrained_layout
работает. Посмотрите этот вопрос. Увеличьте размер / интервал подзаговоров с помощью множества подзаговоров в matplotlib.Я обнаружил, что добавление участков сразу выглядело лучше, т.е.
Но его также можно добавить в момент создания фигуры:
Примечание: чтобы сблизить мои подсюжеты, я также использовал
и constrained_layout не работает с этим :(
источник
Я боролся с Matplotlib подстроечных метод, так что я теперь просто сделал функцию , чтобы сделать это с помощью
bash
вызоваImageMagick
«S mogrify команды , которая хорошо работает и получает все дополнительные пробельные выключения краев фигуры. Это требует, чтобы вы использовали UNIX / Linux, использовалиbash
оболочку иImageMagick
установили.Просто позвоните на это после вашего
savefig()
звонка.источник
Как уже упоминалось, по умолчанию плотный макет не учитывает субтитры. Однако я обнаружил, что можно использовать
bbox_extra_artists
аргумент для передачи субтитра в качестве ограничивающего прямоугольника, который следует учитывать:Это заставляет принять
suptitle
во внимание расчет точной компоновки , и это выглядит так, как вы ожидаете.источник
Единственное, что сработало для меня, - это изменение вызова suptitle:
источник
У меня была похожая проблема, которая возникла при использовании
tight_layout
очень большой сетки графиков (более 200 дополнительных графиков) и рендеринга в блокноте Jupyter. Я сделал быстрое решение, которое всегда размещает васsuptitle
на определенном расстоянии выше вашего верхнего участка:Для субплотов переменного размера вы все еще можете использовать этот метод, чтобы получить верхнюю часть самого верхнего субплота, а затем вручную определить дополнительную сумму для добавления в субтитр.
источник