Python 减少matplotlib绘图中的左右边距

Python 减少matplotlib绘图中的左右边距,python,matplotlib,Python,Matplotlib,我正在努力处理matplotlib中的绘图页边距。我已使用以下代码生成图表: plt.imshow(g) c = plt.colorbar() c.set_label("Number of Slabs") plt.savefig("OutputToUse.png") 然而,我得到了一个输出图,图的两边都有很多空白。我搜索了谷歌并阅读了matplotlib文档,但我似乎找不到如何减少这一点。一种自动实现这一点的方法是bbox\u inches='tight'kwarg-to 例如 另一种方法是使

我正在努力处理matplotlib中的绘图页边距。我已使用以下代码生成图表:

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

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

一种自动实现这一点的方法是
bbox\u inches='tight'
kwarg-to

例如

另一种方法是使用


自动执行此操作的一种方法是使用
bbox\u inches='tight'
kwarg-to

例如

另一种方法是使用


可以使用subplot_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)
这将适用于屏幕上的图形和保存到文件中的图形,即使一个图形上没有多个绘图,也可以调用此函数


数字是地物尺寸的分数,需要进行调整以允许地物标签。

您可以使用子地块调整()函数调整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子地块的问题在于,您输入的值与地物的x和y尺寸有关。此示例用于打印pdf时正确的地物尺寸:

plt.savefig("circle.png", bbox_inches='tight',pad_inches=-1)
为此,我重新计算了绝对值的相对间距,如下所示:

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 mm,下边缘为4 mm,右边缘为1 mm,顶部为3 mm。(x/25.4)的转换已经完成,因为我需要将mm转换为in

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

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


matplotlibs子批次的问题在于,您输入的值与图形的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”英寸的图形。因此,整个图形的左边缘为5 mm,下边缘为4 mm,右边缘为1 mm,顶部为3 mm。(x/25.4)的转换已经完成,因为我需要将mm转换为in

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

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

你所需要的只是

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()
你所需要的只是

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.\uu版本=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数组上绘制一些图形

对我来说,上面的答案不适用于Win7上的
matplotlib.\uuuu版本=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数组上绘制一些图形

只需使用
ax=fig.add_轴([左、下、宽、高])
如果要精确控制地物布局。例如

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

只需使用ax=fig.add_轴([左、下、宽、高]) 如果要精确控制地物布局。例如

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

受上述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=…)

中使用的元组,其灵感来源于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=…)
中使用的元组,以防有人想知道在应用
plt.tight_layout()
fig.tight_layout()
后如何去除剩余的白边(默认情况下为
1.08
),你可以让它更紧: 在图形边缘和子批次边缘之间填充,作为字体大小的一部分 比如说

plt.tight_layout(pad=0.05)

将把它减少到一个很小的幅度。放置
0
对我不起作用,因为它会使子地块的方框也被切掉一点。

以防有人想知道在应用
plt.tight_layout()
fig.tight_layout()
:使用参数
pad
(默认为
1.08
),你可以让它更紧: 在图形边缘和子批次边缘之间填充,作为字体大小的一部分 比如说

plt.tight_layout(pad=0.05)

将把它减少到一个很小的幅度。放置
0
对我不起作用,因为它会使子地块的方框也被切掉一点。

对于最新的matplotlib版本,您可能希望