Уменьшите левые и правые поля в сюжете matplotlib - PullRequest
155 голосов
/ 28 октября 2010

Я изо всех сил пытаюсь разобраться с моими полями сюжета в matplotlib. Я использовал приведенный ниже код для создания своего графика:

plt.imshow(g)
c = plt.colorbar()
c.set_label("Number of Slabs")
plt.savefig("OutputToUse.png")

Однако я получаю выходную фигуру с большим количеством пустого пространства по обе стороны графика. Я искал в Google и прочитал документацию по matplotlib, но, похоже, не могу найти, как это уменьшить.

Ответы [ 8 ]

214 голосов
/ 28 октября 2010

Один из способов автоматически сделать это - bbox_inches='tight' kwarg до plt.savefig.

Например,

import matplotlib.pyplot as plt
import numpy as np
data = np.arange(3000).reshape((100,30))
plt.imshow(data)
plt.savefig('test.png', bbox_inches='tight')

Другой способ - использовать fig.tight_layout()

import matplotlib.pyplot as plt
import numpy as np

xs = np.linspace(0, 1, 20); ys = np.sin(xs)

fig = plt.figure()
axes = fig.add_subplot(1,1,1)
axes.plot(xs, ys)

# This should be called after all axes have been added
fig.tight_layout()
fig.savefig('test.png')
128 голосов
/ 01 ноября 2010

Вы можете настроить интервал вокруг фигур matplotlib, используя функцию subplots_adjust ():

import matplotlib.pyplot as plt
plt.plot(whatever)
plt.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.1)

Это будет работать как для фигуры на экране, так и для сохранения в файл, и это правильная функция для вызова, даже если у вас нет нескольких графиков на одной фигуре.

Числа являются долями размеров фигуры и должны быть скорректированы с учетом меток рисунка.

47 голосов
/ 30 марта 2013

Все, что вам нужно, это

plt.tight_layout()

перед выводом.

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

x = [1,2,3]
y = [1,4,9]
import matplotlib.pyplot as plt
fig = plt.figure()
subplot1 = fig.add_subplot(121)
subplot1.plot(x,y)
subplot2 = fig.add_subplot(122)
subplot2.plot(y,x)
fig.tight_layout()
plt.show()
7 голосов
/ 21 сентября 2016

Просто используйте ax = fig.add_axes([left, bottom, width, height]), если вы хотите точно контролировать раскладку фигуры.например.

left = 0.05
bottom = 0.05
width = 0.9
height = 0.9
ax = fig.add_axes([left, bottom, width, height])
4 голосов
/ 17 декабря 2011
plt.savefig("circle.png", bbox_inches='tight',pad_inches=-1)
3 голосов
/ 19 апреля 2017

вдохновлено ответом Сэммиса выше:

margins = {  #     vvv margin in inches
    "left"   :     1.5 / figsize[0],
    "bottom" :     0.8 / figsize[1],
    "right"  : 1 - 0.3 / figsize[0],
    "top"    : 1 - 1   / figsize[1]
}
fig.subplots_adjust(**margins)

Где figsize - это кортеж, который вы использовали в fig = pyplot.figure(figsize=...)

3 голосов
/ 27 сентября 2012

Проблема с matplotlibs subplots_adjust заключается в том, что вводимые вами значения относятся к размеру x и y на рисунке. Этот пример для правильного определения размера для печати PDF:

Для этого я пересчитываю относительный интервал в абсолютные значения, например:

pyplot.subplots_adjust(left = (5/25.4)/figure.xsize, bottom = (4/25.4)/figure.ysize, right = 1 - (1/25.4)/figure.xsize, top = 1 - (3/25.4)/figure.ysize)

для фигуры дюймов figure.xsize в x-измерении и дюймов figure.ysize в y-измерении. Таким образом, вся цифра имеет левое поле 5 мм, нижнее поле 4 мм, правое поле 1 мм и верхнее 3 мм внутри меток. Преобразование (x / 25.4) сделано потому, что мне нужно было преобразовать мм в дюймы.

Обратите внимание, что чистый размер диаграммы x будет "figure.xsize - левое поле - правое поле", а чистый размер диаграммы y будет "figure.ysize - нижнее поле - верхнее поле" в дюймах

Другие фрагменты (не уверен насчет этих, я просто хотел предоставить другие параметры)

pyplot.figure(figsize = figureSize, dpi = None)

и

pyplot.savefig("outputname.eps", dpi = 100)
2 голосов
/ 24 января 2016

Для меня ответы выше не работали с matplotlib.__version__ = 1.4.3 на Win7. Таким образом, если нас интересует только само изображение (т. Е. Если нам не нужны аннотации, ось, метки, заголовок, ylabel и т. Д.), То лучше просто сохранить массив numpy как изображение вместо savefig.

from pylab import *

ax = subplot(111)
ax.imshow(some_image_numpyarray)
imsave('test.tif', some_image_numpyarray)

# or, if the image came from tiff or png etc
RGBbuffer = ax.get_images()[0].get_array()
imsave('test.tif', RGBbuffer)

Также, используя функции рисования opencv (cv2.line, cv2.polylines), мы можем сделать некоторые рисунки непосредственно в массиве numpy. http://docs.opencv.org/2.4/modules/core/doc/drawing_functions.html

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