减少matplotlib图中的左右边距

时间:2010-10-28 10:58:00

标签: python matplotlib

我正在努力处理matplotlib中的情节边距。我使用下面的代码来制作我的图表:

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

然而,我得到一个输出数字,在图的两边有很多空白区域。我搜索了谷歌并阅读了matplotlib文档,但我似乎无法找到如何减少这一点。

13 个答案:

答案 0 :(得分:209)

自动执行此操作的一种方法是bbox_inches='tight' kwarg到plt.savefig

E.g。

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

答案 1 :(得分:126)

您可以使用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)

这对于屏幕上的数字都有效并保存到文件中,即使你没有多个图,也可以调用它。

数字是图形尺寸的一部分,需要调整以允许图形标记。

答案 2 :(得分:47)

你需要的只是

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

答案 3 :(得分:7)

只需使用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 :(得分:4)

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

答案 5 :(得分:4)

有时候,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

然后将设置粘贴到页边距功能中以使其永久不变:

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

答案 6 :(得分:3)

matplotlibs subplots_adjust的问题是你输入的值是相对于图的x和y figsize。此示例用于正确计算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'英寸。因此,整个图形的左边距为5毫米,底边距为4毫米,右边为1毫米,顶部为3毫米。完成(x / 25.4)的转换是因为我需要将mm转换为英寸。

请注意,x的纯图表大小为“figure.xsize - left margin - right margin”,y的纯图表大小为“figure.ysize - bottom margin - top margin”,单位为英寸

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

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

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

答案 7 :(得分:3)

受上面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=...)

中使用的元组

答案 8 :(得分:2)

对我来说,上面的答案不适用于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

答案 9 :(得分:0)

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

plt.tight_layout(pad=0.05)

会将其减少到很小的幅度。放0对我不起作用,因为它也使子图的框也被切除了。

答案 10 :(得分:0)

对于最新的matplotlib版本,您可能需要尝试Constrained Layout

答案 11 :(得分:0)

# import pyplot
import matplotlib.pyplot as plt

# your code to plot the figure

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

答案 12 :(得分:-2)

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