Почему мой 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.


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")

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
...
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.