Matplotlib窗口类?相当于matplotlib.pyplot.close()的OO?

时间:2013-02-13 19:32:22

标签: class matplotlib

在Matplotlib中:

  • 我可以将matplotlib.pyplot.cla()写为axes.clear(),其中axesmatplotlib.axes.Axes个对象。
  • 我可以将matplotlib.pyplot.clf()写为fig.clear(),其中figmatplotlib.figure.Figure个对象。

然后有matplotlib.pyplot.close()。这关闭了一个窗口。这个窗口对应任何类吗?是否x.close()等同于matplotlib.pyplot.close(),但是更加面向对象的风格?

我的版本matplotlib.pyplot.close()的源代码如下:

if len(args)==0:
    figManager = _pylab_helpers.Gcf.get_active()
    if figManager is None: return
    else:
        _pylab_helpers.Gcf.destroy(figManager.num)
elif len(args)==1:
    arg = args[0]
    if arg=='all':
        _pylab_helpers.Gcf.destroy_all()
    elif isinstance(arg, int):
        _pylab_helpers.Gcf.destroy(arg)
    elif is_string_like(arg):
        allLabels = get_figlabels()
        if arg in allLabels:
            num = get_fignums()[allLabels.index(arg)]
            _pylab_helpers.Gcf.destroy(num)
    elif isinstance(arg, Figure):
        _pylab_helpers.Gcf.destroy_fig(arg)
    else:
        raise TypeError('Unrecognized argument type %s to close'%type(arg))
else:
    raise TypeError('close takes 0 or 1 arguments')

所以,它似乎是基于静态方法 matplotlib._pylab_helpers.Gcf.destroy执行各种我不太关注的事情,注意到在交互式后端中,这被绑定到窗口“destroy”和“delete”事件。但我不确定数字和窗口是如何相关的。

也许我在浪费时间思考这个问题。

1 个答案:

答案 0 :(得分:2)

Gcf是一个全局单例对象,用于保存您使用plt.figure打开的数字列表。

它本质上是一个字典,周围有一些奇特的代码,以保持一致性并跟踪活动数字等。用作Figure(由plt.figure返回的)和GUI层之间的层的类是FigureManagerBase(以及它的per-toolkit子类),它被定义在backend_bases.py

您使用的是哪个子类取决于您使用的是哪个后端。这些子类处理的事情包括确保在单击“x”按钮时系统被删除,以及系统级gui回调。

FigureManager有一个destroy方法触发内部拆除。原则上,如果你有一个Figure对象并希望手动销毁它,你只需要掌握一个经理。对它的引用不存储在Figure对象中,而是存储在Canvas对象中,因此您可以通过

来销毁窗口
fig.canvas.manager.destroy()

会破坏这个数字,但是如果你这样做,它可能无法正确清理Gcf(这将保留对图形管理器的引用),这将使用pyplot制作未来数字有意想不到的数字(它不会回到一个),gca将不会像被执行的那样工作,等等(Qt4就是这种情况)。

如果您要使用pyplot(并确保它始终适用于每个后端),那么您需要

  1. 直接与Gcf对话(它位于_pyplot_helpers.py,一旦你看到它想要做什么就真的不太复杂
  2. 直接与GUI交流(请参阅lib/matplotlib/tests/test_backend_qt4.py中的代码,了解如何使用qt4,但这将取决于工具箱)
  3. plt.close(fig.number)