减lessmatplotlib图中的左右边距

我正在努力处理我在matplotlib中的积分余量。 我使用下面的代码来生成我的图表:

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

但是,我得到了一个输出图,在图的两边都有很多空白区域。 我search谷歌,阅读matplotlib文档,但我似乎无法find如何减less这一点。

自动执行此操作的一种方法是将bbox_inches='tight' 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()函数调整matplotlibgraphics周围的间距:

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

这将适用于屏幕上的graphics并保存到文件中,即使您在一个图中没有多个图,也是正确的调用函数。

数字是数字尺寸的一小部分,需要进行调整才能使用数字标签。

所有你需要的是

 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])”,就可以精确控制graphics布局。 例如。

  left = 0.05 bottom = 0.05 width = 0.9 height = 0.9 ax = fig.add_axes([left, bottom, width, height]) 
 plt.savefig("circle.png", bbox_inches='tight',pad_inches=-1) 

matplotlibs subplots_adjust的问题是你input的值是相对于图的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) 

对于x维中的“figure.xsize”英寸的数字和y维中的“figure.ysize”英寸的数字。 因此,整个graphics的标签内留有5毫米左边距,4毫米底边距,1毫米右边和3毫米顶部。 完成(x / 25.4)的转换是因为我需要将mm转换为英寸。

请注意,x的纯图表大小将是“figure.xsize – 左边距 – 右边距”,y的纯图表大小将是“figure.ysize – bottom margin – top margin”,单位为英寸

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

 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=...)使用的元组fig = pyplot.figure(figsize=...)

对于我来说,上面的答案不适用于Win7上的matplotlib.__version__ = 1.4.3 。 所以,如果我们只对图像本身感兴趣(即,如果我们不需要注释,轴,刻度,标题,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