我在字典中保留了一组数字引用,以便我可以在以后保存它们。如果调用show()
命令并首先查看它们,我感到困扰的是保存的数字是空白的。由于show()
命令阻止而且我没有使用类似spyder的解释器,所以在进入savefig()
figures['myfig_1'] = figure()
...
figures['myfig_n'] = figure()
...
#show() #disabling this makes the problem go away
print "Saving:"
for fig in figures:
figure(figures[fig].number)
savefig(fig)
print "Figure " + str(figures[fig].number) + ": " + fig
这里的print语句告诉我字典仍然完好无损,我认为这意味着我没有丢失图引用(它们仍然在.number
属性中返回有意义的数字。)
我注意到的另一个转折是,当我在类中做了类似的事情,将字典存储为成员并将存储分开并将函数保存到自己的方法中时,这不会发生。是关于我关闭数字或存储数据的方式是什么,这使得数据松散了他们的数据?
答案 0 :(得分:7)
一般来说,在这种情况下,不要使用matplotlib的交互式matlab-ish状态机接口。它适用于交互式使用。
你试图让一个数字“活跃”,然后创建一个新的数字。如果只保留返回的图形和/或轴对象并直接使用它们,则哪个图形处于活动状态并不重要。 (另外,不要使用通配符导入!当你维护代码时,你将后悔它!)
做这样的事情:
import matplotlib.pyplot as plt
figures = {}
figures['a'] = plt.figure()
ax = figures['a'].add_subplot(111)
ax.plot(range(10), 'ro-')
figures['b'] = plt.figure()
ax = figures['b'].add_subplot(111)
ax.plot(range(10), 'bo-')
plt.show()
for name, fig in figures.iteritems():
fig.savefig('figure-%s.png' % name)
答案 1 :(得分:2)
从documentation开始,绘图元素是否从show()
中删除取决于backend和matplotlib的版本。版本1.1.0似乎没有销毁数据。要确定which backend is in use,请使用get_backend()
功能。就我而言,我使用的是Qt4Agg后端。通过调用TkAgg后端,通过调用matplotlib.use('TkAgg')
,数字在保存之前没有被销毁。现在来了解如何改变Qt4Agg ...