如果我创建一个数字然后执行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,这可能有效。到目前为止没有运气。
答案 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()
方法关闭窗口,仅显示引用的特定数字由那个框架经理。