减少matplotlib图中的左右边距

rob*_*ntw 161 python matplotlib

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

plt.imshow(g)
c = plt.colorbar()
c.set_label("Number of Slabs")
plt.savefig("OutputToUse.png")
Run Code Online (Sandbox Code Playgroud)

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

Joe*_*ton 226

自动执行此操作的一种方法是使用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')
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用 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')
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法让它成为默认值? (5认同)
  • @detly - 是的.这正是它的作用(虽然它也可以"缩小"并使图像更大).对于你想要的,看看`fig.tight_layout()`.当这个答案最初编写时,该功能不存在,否则我会更突出地提及它. (5认同)
  • 所有这些都是在渲染后裁剪图像;如果您尝试强制执行特定分辨率,图像会*小*​​。 (2认同)
  • 如果有人有问题,请使用```fig = plt.gcf()``` (2认同)

Dav*_*veP 132

您可以使用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)
Run Code Online (Sandbox Code Playgroud)

这将适用于屏幕上的图形并保存到文件中,即使您在一个图形上没有多个图形,它也是正确的调用功能.

数字是图形尺寸的分数,需要调整以允许图形标签.

  • 分配给参数的值而不是更改它的值,它们是设置边距的位置.换句话说,如果你想要将右边缘边距提高10%,你应该设置右= 0.9,而不是右边= 0.1 http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.subplots_adjust (7认同)
  • 指出显然您可以在 plt.subplots_adjust() 中指定负值是有意义的。这样做甚至可以让您在图形区域之外进行绘制,并且还可以处理烦人的边距。 (3认同)

小智 52

所有你需要的是

plt.tight_layout()
Run Code Online (Sandbox Code Playgroud)

输出之前.

除了缩小边距外,这还可以将任何子图之间的空间紧密分组:

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()
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是最好的方法.它不需要保存像'bbox ='tight'这样的数字,并且在狭窄的数字中修复了各种其他布局问题. (7认同)
  • 这应该是正确的答案,因为它的行为与您所期望的一样,因为它适用于图而不是图像. (2认同)

小智 11

有时,plt.tight_layout()没有给我最好的视图或我想要的视图。那么为什么不先用任意边距进行绘图,然后在绘图后固定边距呢?因为我们从那里得到了很好的 WYSIWYG。

import matplotlib.pyplot as plt

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

plt.plot([2,5,7,8,5,3,5,7,])
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处更改边框和间距 GUI

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

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()
Run Code Online (Sandbox Code Playgroud)

  • 这确实是一个很好的提示 - 我从来没有发现那里的“导出”按钮..谢谢。 (2认同)

小智 8

如果有人想知道如何在应用plt.tight_layout()或之后去除其余的白边fig.tight_layout():使用参数pad1.08默认情况下),您可以使其更紧密:“图形边缘和边缘之间的填充子图,作为字体大小的一小部分。” 所以例如

plt.tight_layout(pad=0.05)
Run Code Online (Sandbox Code Playgroud)

将其减少到很小的幅度。Putting0对我不起作用,因为它也会使子图的框被切掉一点。


小智 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])
Run Code Online (Sandbox Code Playgroud)


Mic*_*ter 6

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

constrained_layout自动调整子图和装饰(例如图例和颜色条),以便它们适合图形窗口,同时仍然尽可能保留用户请求的逻辑布局。

constrained_layout与ight_layout类似,但使用约束求解器来确定允许它们适合的轴的大小。

在将任何轴添加到图形之前,需要激活constrained_layout 。

可惜熊猫处理不好......


小智 5

plt.savefig("circle.png", bbox_inches='tight',pad_inches=-1)
Run Code Online (Sandbox Code Playgroud)

  • 设置为0,有帮助 (3认同)
  • “pad_inches=-1”导致我的 savefig 只生成部分图形。 (2认同)

mic*_*ege 5

受上述 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)
Run Code Online (Sandbox Code Playgroud)

其中 figsize 是您使用的元组 fig = pyplot.figure(figsize=...)