如何在show()之后为matplotlib图设置tight_layout

Jan*_*rny 6 python linux xmonad matplotlib

我的设置:

Debian Linux 8.3 amd64,XMonad WM,python2.7,matplotlib 1.5.1

问题:

我正在制作一个情节,例如:

import matplotlib.pyplot as plt

x = xrange(10)
y1 = [i ** 2 for i in x]
y2 = [1.0 / (i + 1) for i in x]

fig = plt.figure()
ax1 = plt.subplot(1, 2, 1)
ax1.plot(x, y1)
ax2 = plt.subplot(1, 2, 2)
ax2.plot(x, y2)

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

因为我正在使用平铺窗口管理器,所以matplotlib的窗口被拉伸到一个平铺.不幸的是,这使图形变小,布局有些松散.

如果我想"收紧"它,请点击"配置子图 - >紧密布局"完成工作.但这意味着我必须每次点击图标然后点击按钮,因为我使用这个图来显示测试数据并且经常运行它,这非常烦人.所以我尝试了一些方法来使这更容易:

我试过了什么:

这一切都没有改变,或者至少对于一行中的2个子图看起来相同,但是对于多行,它使布局更松散,所有子图都非常小.

我怀疑的是:

我认为这个问题与调整大小有关,这可能发生在窗口创建之后,因此tighten_layout可以使用原始窗口尺寸.当窗口管理器调整窗口大小时,布局保留子图块大小,并且我有一个带有微型图形的"松散"布局.

这个问题

有没有办法自动(或非常容易 - 像使用key_press_event) 收紧布局,即使在调用后立即调整窗口大小plt.show()

Tho*_*ühn 7

借助Matplotlib事件处理,您可以实现您想要的效果.只需编写一个小函数,tight_layout每次调整数字时调用并更新数字:

from matplotlib import pyplot as plt
import numpy as np

x = np.linspace(0,np.pi,100)
y1 = np.sin(x)
y2 = np.cos(x)
fig, (ax1,ax2) = plt.subplots(nrows=1, ncols=2)
fig.tight_layout()
ax1.plot(x,y1)
ax2.plot(x,y2)

def on_resize(event):
    fig.tight_layout()
    fig.canvas.draw()

cid = fig.canvas.mpl_connect('resize_event', on_resize)

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

当然,这很可能是系统或版本依赖的.我在MacOS Sierra上用Python 3.5.4(Matplotlib 2.0.2)和Python 2.7.14(Matplotlib 2.1.0)验证了上面的例子.希望这可以帮助.

编辑:

事实上,我认为你的按键处理程序如果你之后更新了这个数字就行了tight_layout,即如果你已经调用了fig.canvas.draw().