Точный размер рисунка в matplotlib с заголовком, метками оси - PullRequest
18 голосов
/ 08 января 2012

Подобные вопросы задавались ранее, но все мои результаты поиска не решить мою проблему. Возьмите следующий пример кода:

from matplotlib.pyplot import *
fig = figure(1, figsize=(3.25, 3))
plot([0,1,5,2,9])
title('title')
xlabel('xAxis')
ylabel('yAxis')
fig.savefig('test.png',dpi=600)

Результирующее значение составляет 2040x1890 пикселей или 3,4 "x3,15", а метка x отрезан Глядя на файл PNG в редакторе изображений, кажется, что оси и метки соответствуют желаемому размеру. Я пытался взять разница от выходного размера и запрошенного размера и подачи обратно в (3.25 - (3.4-3.25) = 3.10, но кажется, что matplotlib добавляет произвольную буфер, и он до сих пор не выходит на нужный размер. Как один сделать общую цифру, которая является желаемого размера?

Ответы [ 2 ]

10 голосов
/ 08 января 2012

В соответствии с комментарием Дэвида Робинсона, полученная здесь цифра составляет 3,25 на 3 дюйма, измеренная фотошопом, хотя xlabel показывает обрезание (mpl 1.1.0 в python 2.6 64-bit, win7)

Решением этой проблемы является ручная настройка полей с помощью subplot_adjust:

from matplotlib.pyplot import *
fig = figure(1, figsize=(3.25, 3))
plot([0, 1, 5, 2, 9])
title('title')
xlabel('xAxis')
ylabel('yAxis')
subplots_adjust(bottom=0.14)   # <--
fig.savefig('test.png', dpi=600) 

Значение по умолчанию для этих полей устанавливается в файле matploblibrc, и вы можете изменить его там навсегда.Значение по умолчанию для нижнего поля в моем случае было 0,10.

Либо, если ваша фигура имеет неправильный размер или правильную, как в моем случае, вы можете использовать subplot_adjust, чтобы обеспечить достаточно места для метки.Затем, если необходимо, вы можете рассчитать поправку, чтобы получить фактический размер изображения или фигуры, который вы хотите, как вы уже сделали.

Окончательный вид сохраненной фигуры зависит от размера этой фигуры.Если вы show() свою фигуру и сохраните ее из рамки просмотра matplotlib, вы получите обрезку метки на изображении.Но если вы вручную увеличите размер изображения, вы увидите метку, и если вы сохраните ее, то она также появится на сохраненном изображении.Допустим, это WYSIWYG.Ваша фигура очень небольшого размера, и это делает вашу этикетку разрезанной.Таким образом, другой подход состоит в том, чтобы сделать большую цифру, возможно, с меньшим разрешением, чтобы сохранить общий размер.Это также работает:

from matplotlib.pyplot import *
fig = figure(1, figsize=(6.5, 6))   # <---
plot([0, 1, 5, 2, 9])
title('title')
xlabel('xAxis')
ylabel('yAxis')
fig.savefig('test.png', dpi=300)    # <---

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

8 голосов
/ 18 сентября 2012

matplotlib 1.1.1 добавил figure.tight_layout() ( doc ), который сделает это за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...