减少matplotlib图的左右边距

我正在努力处理matplotlib中的图边距。我使用下面的代码来生成我的图表:

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

然而,我得到的输出数字在图的两边都有大量的空白。我已经搜索了谷歌并阅读了matplotlib文档,但我似乎找不到如何减少这一点。

337096 次浏览

自动做到这一点的一种方法是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')

你可以使用subplots_adjust()函数来调整matplotlib图的间距:

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

这既适用于屏幕上的图形,也适用于保存到文件中的图形,即使在一个图形上没有多个图形,也可以调用这个函数。

这些数字是图形尺寸的分数,并且需要调整以允许图形标签。

plt.savefig("circle.png", bbox_inches='tight',pad_inches=-1)

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”的数字。“x维英寸”和“数字”。y尺寸为英寸。因此,整个图形在标签放置范围内左侧空白5mm,底部空白4mm,右侧空白1mm,顶部空白3mm。(x/25.4)的转换已经完成,因为我需要将mm转换为英寸。

注意,x的纯图表大小将是“figure”。Xsize -左边距-右边距”而纯图y的大小将为“图”。Ysize -下距-上距",单位为英寸

其他sniplets(不确定这些,我只是想提供其他参数)

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

而且

pyplot.savefig("outputname.eps", dpi = 100)

你所需要的就是

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()

对我来说,上面的答案与Win7上的matplotlib.__version__ = 1.4.3不工作。因此,如果我们只对图像本身感兴趣(即,如果我们不需要注释、轴、刻度、标题、ylabel等),那么最好直接将numpy数组保存为image,而不是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. exe)。Line, cv2.polylines),我们可以直接在numpy数组上做一些绘图。http://docs.opencv.org/2.4/modules/core/doc/drawing_functions.html

只需使用ax = fig.add_axes([left, bottom, width, height]) 如果你想要精确控制图形布局。如:< / p >

left = 0.05
bottom = 0.05
width = 0.9
height = 0.9
ax = fig.add_axes([left, bottom, width, height])

受到sammy回答的启发:

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=...)中使用的元组

如果有人想知道如何在应用plt.tight_layout()fig.tight_layout()后消除其余的白色边距:使用参数pad(默认为1.08),你可以使它更紧凑: “图形边缘和子图边缘之间的填充,作为字体大小的一部分。” 例如

plt.tight_layout(pad=0.05)

会把利润降低到很小的程度。放0对我不起作用,因为它使得subplot的盒子也被切断了一点。

对于最近的matplotlib版本,你可能想尝试约束布局:

constrained_layout自动调整子图和装饰 图例和颜色条,以便它们适合在图形窗口 仍然尽可能地保留所请求的逻辑布局 用户。< / p > constrained_layout类似于tight_layout,但是使用了一个约束 求解器来确定允许它们适合的轴的大小

constrained_layout需要在添加任何轴之前被激活 图。< / p >

熊猫不能很好地处理它

有时候,plt.tight_layout()不能给我最好的视图或我想要的视图。那为什么不先画任意边距然后再确定边距呢?

import matplotlib.pyplot as plt


fig,ax = plt.subplots(figsize=(8,8))


plt.plot([2,5,7,8,5,3,5,7,])
plt.show()

Change border and spacing GUI here

然后将设置粘贴到margin函数,使其永久:

fig,ax = plt.subplots(figsize=(8,8))


plt.plot([2,5,7,8,5,3,5,7,])
fig.subplots_adjust(
top=0.981,
bottom=0.049,
left=0.042,
right=0.981,
hspace=0.2,
wspace=0.2
)
plt.show()
# import pyplot
import matplotlib.pyplot as plt


# your code to plot the figure


# set tight margins
plt.margins(0.015, tight=True)

请删除“sharex=True”和“sharey=True”键;在你的程序中。我想你还没有上传完整的程序在这里。希望我的回答对你的疑问有所帮助。