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

例如

另一种方法是使用


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


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

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-下边距-上边距”,单位为英寸

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

你所需要的只是

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数组上绘制一些图形

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

plt.tight_layout(pad=0.05)

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

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

受约束的_布局会自动调整子地块和装饰,如 图例和颜色栏,以便在 仍然尽可能保留客户要求的逻辑布局 用户

受约束的_布局类似于,但使用约束 解算器,用于确定轴的大小,以使轴适合

在将任何轴添加到中之前,需要激活受约束的_布局 一个数字


太糟糕了…

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

然后将设置粘贴到边距功能中,使其永久:

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

问题是
imshow
图形的
范围中的空白量,还是由
savefig
生成的图形周围的结果png中的边框空白量?我认为两者都有-在查看窗口和png中似乎都有很大的空间。但是,重要的输出是由
savefig
生成的png文件,这就是我要排序的内容。我刚刚在GIMP中对它们进行了裁剪:/边际利润(x=0.01)就是你想要的!指定给参数的值,而不是更改多少,它们是设置边距的位置。换句话说,如果您想将右边缘边距增加10%,那么应该将right=0.9,而不是right=0.1。指出显然可以在plt.subplot\u adjust()中指定负值。这样做甚至可以让您在图形区域之外绘制,也可以处理恼人的边距。这也可以通过调用
update
方法对
GridSpec
对象起作用(请参见)。有没有办法将其设为默认值?如果您有多个子图,并且希望保存每个子图,您可以将其与
fig.savefig()一起使用
也是。(
plt.savefig()
在这种情况下不起作用。)所做的只是在渲染后裁剪图像;如果您试图强制执行特定的分辨率,图像将变小。@detly-yes。这正是它所做的(尽管它也可以裁剪出图像并使图像变大)。要了解您想要的内容,请查看
fig.tight\u layout()
。这个函数在最初编写此答案时不存在,否则我会更突出地提到它。如果有人有问题,请使用
fig=plt.gcf()
我认为这确实是最好的方法。它不需要像'bbox='tight'那样保存图形,并且修复了狭窄图形中的所有其他布局问题。这应该是正确的答案,因为它的行为与您预期的一样,因为它适用于图形而不是图像。奇怪的是
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)
plt.tight_layout(pad=0.05)
import matplotlib.pyplot as plt

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

plt.plot([2,5,7,8,5,3,5,7,])
plt.show()
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)