【问题标题】:how to close a show() window but keep the figure alive?如何关闭 show() 窗口但保持图形活着?
【发布时间】:2014-10-14 16:35:00
【问题描述】:

如果我创建一个图形然后执行 plt.close() :

from matplotlib import pyplot as plt

fig1 = plt.figure()
fig2 = plt.figure()

fig1.show()
plt.close()
fig1.show()
fig2.show()

fig1 只会显示一次,因为 plt.close() 会破坏 fig1 引用的图形对象。如何只关闭窗口而不破坏图形?

到目前为止,没有任何东西真正起作用。 在每个 plt.figure() 之后,将生成一个新的 figure_manager。并将被放入 plt 实例中的列表中。

>>> print plt.get_fignums()
[1, 2]

但是,在plt.close()之后,会弹出具体图形的figure_manager。

>>> print plt.get_fignums()
[2]

正如@John Sharp 提到的 plt._backend_mod.new_figure_manager_given_figure(plt.get_fignums()[-1]+1,fig1) 将为 fig1 创建一个新的 figure_manager。但是,它尚未添加到 plt.所以 plt 时无法控制那些 figure_manager:

>>> plt._backend_mod.new_figure_manager_given_figure(plt.get_fignums()[-1]+1,fig1)
<matplotlib.backends.backend_tkagg.FigureManagerTkAgg instance at 0x2b0f680>

>>> print plt.get_fignums()
[2]

>>> plt.new_figure_manager(1)
<matplotlib.backends.backend_tkagg.FigureManagerTkAgg instance at 0x2b1e3f8>
>>> plt.get_fignums()
[2]

所以不能被plt.close()关闭,除非直接调用figure_manager.destroy()

直接设置当前fm的建议会更差:

fm = plt.get_current_fig_manager()
fm.canvas.figure = fig1
fig1.canvas = fm.canvas

乍一看,这似乎可行。但是会直接把fig2的fm改成指向fig1,会很麻烦。

如果有什么办法,我们可以让pyplot来注册手动生成的fm,这可能会奏效。到目前为止还没有运气。

【问题讨论】:

    标签: matplotlib


    【解决方案1】:

    由于图形仍然由名称 fig1 引用,因此它不会被销毁。您只需要为该图创建一个新的图管理器。一种方法是通过生成一个新的空白图形并手动将画布图形设置为 fig1 来获得一个新的图形管理器:

    plt.figure()
    fm = plt.get_current_fig_manager()
    fm.canvas.figure = fig1
    fig1.canvas = fm.canvas
    

    完成此操作后,您可以显示并关闭图形:

    fig1.show()
    plt.close()
    

    或者,如果您同时显示两个图形并且只想关闭一个特定图形,则可以调用 fm.destroy() 方法来关闭仅显示该框架管理器引用的特定图形的窗口,而不是使用 plt.close() .

    【讨论】:

    • 非常感谢。我发现不仅 wxagg、tkagg 或任何 agg 都会有相同的 new_figure_manager_given_figure() 函数。然而,这似乎只适用于 1.3.1 而不是旧版本。在旧版本中,它会触发一些错误。我还没有接受你的回答。因为我在再次关闭这些数字时遇到了一些问题。 plt.close() 将不再起作用。
    • 哦,我没注意到!我已经编辑了我的答案,以便它使用 matplotlib.pyplot 模块的当前图形管理器。这种方式 plt.close() 的行为符合预期。
    • 仅生成一个新鲜的空白图形并将其画布设置为指向 fig1 的画布是否可以解决您在问题中提到的问题?通过查看文档,我看不到一种自动注册新框架管理器的优雅方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多