【发布时间】: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