1

在 Matplotlib 中:

  • 我可以写matplotlib.pyplot.cla()axes.clear(),对象在axes哪里matplotlib.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方法,它做了很多我不太关注的事情,注意到在交互式后端,这与窗口“销毁”和“删除”事件有关。但我不确定数字和窗口是如何相关的。

也许我在浪费时间甚至考虑这个。

4

1 回答 1

2

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

它本质上是一本字典,周围有一些花哨的代码,以保持一致并跟踪活动人物等。用作(Figure由. plt.figure_FigureManagerBasebackend_bases.py

您使用的子类取决于您使用的后端。这些子类处理诸如确保在单击“x”按钮时删除图形以及系统级 gui 回调之类的事情。

FigureManagers 有一种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了解如何使用 with qt4,但这将非常依赖于工具包)
  3. plt.close(fig.number)
于 2013-02-13T21:53:16.513 回答