Почему мой xlabel отключен в моем сюжете matplotlib?

303

Я строю набор данных, используя matplotlib строю где у меня достаточно «высокий» xlabel (это формула, представленная в TeX, которая содержит дробь и, следовательно, имеет высотный эквивалент нескольких строк текста).

В любом случае, нижняя часть формулы всегда обрезается, когда я рисую фигуры. Изменение размера фигуры, кажется, не помогает этому, и я не смог понять, как сдвинуть ось X вверх, чтобы освободить место для xlabel. Нечто подобное было бы разумным временным решением, но было бы неплохо иметь способ, позволяющий matplotlib автоматически распознавать, что метка обрезается, и соответственно изменяет размер.

Вот пример того, что я имею в виду:

import matplotlib.pyplot as plt

plt.figure()
plt.ylabel(r'$\ln\left(\frac{x_a-x_b}{x_a-x_c}\right)$')
plt.xlabel(r'$\ln\left(\frac{x_a-x_d}{x_a-x_e}\right)$')
plt.show()

в то время как вы можете видеть весь ylabel, xlabel отсекается внизу.

В случае, если это проблема конкретной машины, я запускаю это на OSX 10.6.8 с matplotlib 1.0.0

Андрей
источник
4
Вы можете разместить на сайте хостинга изображений и разместить ссылку здесь.
AGF
1
Это помогает, если вы можете опубликовать минималистичный пример кода, который вызывает эту проблему. Таким образом, люди смогут быстрее понять и воспроизвести вашу проблему, и они с большей вероятностью помогут вам.
Денилсон Са Майя
Ваш код работает отлично (отображать формулу полностью видимым) на моем компьютере (Ubuntu 11.04 64bit). Может быть, это машинно-специфическая проблема [например, шрифт с неверной размерной информацией, используемой в изображении?]. Возможно, вы могли бы указать систему, которую вы используете в своем вопросе.
Мак
9
Вы также можете попробовать plt.savefig("test.png",bbox_inches='tight'): stackoverflow.com/questions/21288062/…
Yibo Yang

Ответы:

475

Использование:

import matplotlib.pyplot as plt

plt.gcf().subplots_adjust(bottom=0.15)

освободить место для этикетки.

Редактировать:

Так как я дал ответ, matplotlibдобавил tight_layout()функцию. Поэтому я предлагаю использовать его:

plt.tight_layout()

должен освободить место для xlabel.

tillsten
источник
141
Я нахожу довольно странным, что нужно сделать дополнительный звонок, чтобы освободить место для важной части сюжета. В чем причина этого?
другой бен
3
Просто из любопытства, почему у вас есть, gcf().subplots_adjustа не plt.subplots_adjust? Есть ли разница?
можжевельник
49
Какие есть gcfи gca? Вы забыли объяснить!
полковник Паник
12
Я столкнулся с той же проблемой, и хотя я tight_layout()исправил отсечение xlabels, это, к сожалению, привело к тому, что мой ylabel обрезался (что раньше не было обрезано). Тем не менее, первое лекарство ( subplots_adjust(bottom=0.25)) работало хорошо. Спасибо.
Скотт Х
17
@ColonelPanic gcf()и gca()«получить текущую фигуру» и «получить текущую ось», соответственно.
DrMisha
150

Простой вариант - настроить matplotlib для автоматической настройки размера графика. Он отлично работает для меня, и я не уверен, почему он не активирован по умолчанию.

Способ 1

Установите это в вашем файле matplotlibrc

figure.autolayout : True

Смотрите здесь для получения дополнительной информации о настройке файла matplotlibrc: http://matplotlib.org/users/customizing.html

Способ 2

Обновите rcParams во время выполнения, как это

from matplotlib import rcParams
rcParams.update({'figure.autolayout': True})

Преимущество использования этого подхода заключается в том, что ваш код будет отображать одни и те же графики на машинах с различной конфигурацией.

Амит Москович
источник
У меня были некоторые проблемы со слишком большими цветными полосами при использовании этой опции. Одно из возможных решений обсуждается здесь: matplotlib.org/users/tight_layout_guide.html
PiQuer
2
Тогда я установил беспорядок, когда я установил пользовательские (большие!) размеры шрифтов. Это делает работу намного лучше.
BenB
Обновление rcParams было действительно единственным, что работало для меня при использовании pgf backend с LaTeX. (хотя это делает сюжет прямоугольным, что я не против)
h4nek
Только это сработало для меня; ничего из трудного-тайм-аута или box_inches не сработало
zed111
106

Если вы хотите сохранить его в файл, вы решаете его с помощью bbox_inches="tight"аргумента:

plt.savefig('myfile.png', bbox_inches = "tight")
Guido
источник
2
@Guido спас день
pcko1
7

Положив plot.tight_layout()после всех изменений на графике, только до show()или savefig()решит проблему.

Армин Окич
источник
1
Это не освобождает место для нижней части сюжета, а скорее изменяет масштаб всего сюжета, что может в некоторых случаях (как у меня) сделать сюжет действительно странным.
89f3a1c
5

Вы также можете установить пользовательские отступы по умолчанию в вашем, $HOME/.matplotlib/matplotlib_rcкак показано ниже. В приведенном ниже примере я изменил как нижний, так и левый готовый отступ:

# The figure subplot parameters.  All dimensions are a fraction of the
# figure width or height
figure.subplot.left  : 0.1 #left side of the subplots of the figure
#figure.subplot.right : 0.9 
figure.subplot.bottom : 0.15
...
Мати Тернер
источник