如何关闭show()窗口但保持图形活着?

时间:2014-08-21 06:32:14

标签: matplotlib

如果我创建一个数字然后执行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,这可能有效。到目前为止没有运气。

1 个答案:

答案 0 :(得分:1)

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

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

完成此操作后,您可以显示然后用以下内容关闭图:

fig1.show()
plt.close()

或者,如果您一次显示两个数字并且只想关闭特定的数字,而不是使用plt.close(),则可以调用fm.destroy()方法关闭窗口,仅显示引用的特定数字由那个框架经理。