Подтвердить что ты не робот

Точный размер фигуры в matplotlib с метками заголовка, оси

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

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-label отключается. Рассматривая PNG файл в редакторе изображений, кажется, что оси и тик-этикетки соответствуют желаемому размеру. Я попытался взять разница с размером вывода и запрошенным размером и подачей обратно в (3.25 - (3.4-3.25) = 3.10, но matplotlib, кажется, добавляет произвольное буфера, и он по-прежнему не достигает желаемого размера. Как один сделать общую цифру, которая является желаемым размером?

4b9b3361

Ответ 1

В согласии с комментарием Дэвида Робинсона цифра, полученная здесь, составляет 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, так как вы могли ожидать, что после сюжета и сохранения будет необработанная фигура.

Ответ 2

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