如何在show()

时间:2016-06-22 12:47:06

标签: python linux matplotlib xmonad

我的设置:

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

因为我正在使用平铺窗口管理器,所以matplotlib的窗口会得到 拉伸到瓷砖。不幸的是,这会使图表变小和布局 有点宽松。

如果我想“紧缩”它,请点击“配置子图 - >紧 布局“完成工作。但这意味着我必须单击图标然后再打开 按钮每次 ,因为我使用此图显示测试数据 并经常运行,这很烦人。所以我尝试了一些方法 这更容易:

我尝试了什么:

  • plt.tight_layout()之前调用show()

    ...
    ax2.plot(x, y2)
    
    plt.tight_layout()
    plt.show()
    
  • 添加按键处理程序(所以我只按“t”):

    ...
    ax2.plot(x, y2)
    
    def kbd_handler(event):
        if event.key == 't':
            plt.tight_layout()
    
    plt.gcf().canvas.mpl_connect('key_press_event', kbd_handler)
    plt.show()
    
  • 在图中调用tight_layout

    ax2.plot(x, y2)
    
    fig.tight_layout()
    plt.show()
    

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

我怀疑:

我认为这个问题与调整后的问题有关 窗口已创建,因此tighten_layout适用于原始窗口 尺寸。当窗口管理器调整窗口大小时,布局保持不变 子图大小和我有一个“松散”布局与微型图..

问题

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

1 个答案:

答案 0 :(得分:5)

您可以在Matplotlib event handling的帮助下实现您想要的效果。只需编写一个调用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()

当然,这很可能是系统或版本相关的。我在MacOS Sierra上用Python 3.5.4(Matplotlib 2.0.2)和Python 2.7.14(Matplotlib 2.1.0)验证了上面的例子。希望这会有所帮助。

修改

事实上,如果您在tight_layout之后更新了数字,我认为您的按键处理程序会有效,即如果您调用了fig.canvas.draw()