Уменьшите левое и правое поля в графике matplotlib
Я изо всех сил пытаюсь справиться с моими полями сюжета в matplotlib. Я использовал код ниже, чтобы создать свою диаграмму:
plt.imshow(g)
c = plt.colorbar()
c.set_label("Number of Slabs")
plt.savefig("OutputToUse.png")
тем не менее, я получаю выходную фигуру с большим количеством белого пространства по обе стороны от графика. Я искал google и читал документацию matplotlib, но я не могу найти, как уменьшить это.
8 ответов:
один из способов автоматически сделать это -
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')
вы можете настроить интервал вокруг фигур 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)Это будет работать как для фигуры на экране, так и для сохранения в файл, и это правильная функция для вызова, даже если у вас нет нескольких участков на одной фигуре.
числа являются фракциями размеров фигуры и должны быть скорректированы с учетом меток фигуры.
все, что вам нужно-это
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()
просто используйте " 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])
проблема с matplotlibs subplots_adjust заключается в том, что значения, которые вы вводите, относятся к X и y figsize фигуры. В этом примере для правильной figuresizing для печати 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-измерении и' рисунок.ysize' дюймов в y-измерении. Таким образом, вся фигура имеет левый край 5 мм, нижний край 4 мм, правый 1 мм и верхней части 3 мм в надписей. Преобразование (x / 25.4) выполняется, потому что мне нужно было преобразовать мм в дюймы.
обратите внимание, что чистый размер диаграммы x будет "рисунок.xsize-left margin-right margin" и чистый размер диаграммы y будет " фигурой.ysize - нижняя граница - верхняя граница" в дюймах
другие сниплеты (не уверен насчет этих, я просто хотел предоставить другие параметры)
pyplot.figure(figsize = figureSize, dpi = None)и
pyplot.savefig("outputname.eps", dpi = 100)
вдохновленный ответом Sammys выше:
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=...)
для меня ответы выше не работает с
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.линии, cv2.полилинии), мы можем сделать некоторые рисунки непосредственно на массиве numpy. http://docs.opencv.org/2.4/modules/core/doc/drawing_functions.html
Comments