Чому мій 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
Це допомагає, якщо ви можете опублікувати мінімалістичний зразок коду, який викликає цю проблему. Таким чином, люди зможуть швидше зрозуміти та відтворити вашу проблему, і вони швидше допоможуть вам.
Denilson Sá Maia

Ваш код працює чудово (відображення формули повністю видно) на моїй машині (ubuntu 11.04 64bit). Можливо, є специфічна для машини проблема (як, наприклад, шрифт з неправильною розмірною інформацією, що використовується у зображенні?). Можливо, ви можете вказати систему, яку ви використовуєте у своєму запитанні.
мак

9
Ви також можете спробувати plt.savefig("test.png",bbox_inches='tight'): stackoverflow.com/questions/21288062/…
Ібо Ян

Відповіді:


474

Використання:

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
У тій чи іншій мірі, коли я встановлюю спеціальні (великі!) шрифти, створює безлад. Це робить набагато кращу роботу.
БенБ

Оновлення rcParams насправді було єдиним, що працювало для мене під час використання pgf backend з LaTeX. (хоча це робить сюжет прямокутним, що я не заперечую)
h4nek

Тільки це працювало на мене; жоден з тісних_лауетів або бокс_інчей не працював
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.