matplotlib数字在show()和savefig()之间消失

时间:2011-05-16 15:38:39

标签: python matplotlib

我在字典中保留了一组数字引用,以便我可以在以后保存它们。如果调用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属性中返回有意义的数字。)

我注意到的另一个转折是,当我在类中做了类似的事情,将字典存储为成员并将存储分开并将函数保存到自己的方法中时,这不会发生。是关于我关闭数字或存储数据的方式是什么,这使得数据松散了他们的数据?

2 个答案:

答案 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 ...

的行为