Python matplotlib图形在show()和savefig()之间消失

Python matplotlib图形在show()和savefig()之间消失,python,matplotlib,Python,Matplotlib,我在字典中保留了一组数字参考,以便以后需要时保存它们。如果调用show()命令并首先查看它们,则保存的数字是空白的,这让我感到不安。由于show()命令阻塞,并且我没有使用类似spyder的解释器,因此在进入savefig()之前,我必须关闭这些图形 这里的print语句告诉我字典仍然完好无损,这意味着我没有丢失图形引用(它们仍然在.number属性中返回有意义的数字) 我注意到的另一个扭曲是,当我在一个类中做了类似的事情,将字典存储为一个成员,并将存储和保存函数划分为它们自己的方法时,这种情况

我在字典中保留了一组数字参考,以便以后需要时保存它们。如果调用
show()
命令并首先查看它们,则保存的数字是空白的,这让我感到不安。由于
show()
命令阻塞,并且我没有使用类似spyder的解释器,因此在进入
savefig()之前,我必须关闭这些图形

这里的print语句告诉我字典仍然完好无损,这意味着我没有丢失图形引用(它们仍然在
.number
属性中返回有意义的数字)


我注意到的另一个扭曲是,当我在一个类中做了类似的事情,将字典存储为一个成员,并将存储和保存函数划分为它们自己的方法时,这种情况不会发生。我关闭图形或存储数据的方式是否会导致图形丢失数据?

一般来说,在这种情况下,不要使用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)

从中,是否从
show()
销毁图形元素取决于,以及matplotlib的版本。在1.1.0版中似乎可以不销毁这些数字。要解决这个问题,请使用
get\u backend()
函数。在我的例子中,我使用的是Qt4Agg后端。通过调用TkAgg后端,使用调用
matplotlib.use('TkAgg')
在保存之前不会销毁图形。现在了解如何更改Qt4Agg的行为

我的新特性就出现在这里,我甚至不知道有这样一种巧妙的方法可以同时迭代键和值。我也同意通配符导入问题。我在一个新的环境中,有一种“吉特·多恩”的文化。除了增加名称冲突的可能性外,它还使了解功能的来源变得更加困难。我改变了我的方式,现在使用.iteritems()方法,但我遇到了相同的问题:在show()之后,在关闭交互窗口后,这些图形似乎被删除。解释器在.savefig命令上停止,并遍历print_figure.draw()draw.update()的调用堆栈,其中它告诉我底层c/c++对象已被删除。“状态机”方法似乎可以工作。如果没有pyplot.show(),则可以正确调用和保存图形。如果显示它们,然后关闭,则它们将丢失。我不知道这是否是pyplot.show()的意图的一部分,但这似乎是正在发生的事情。我不知道这是否是一个因素,但我正在导入一个名为pylab的包,我想它会给我pyplot,但我真的不知道。我想出了一个答案,但我在8小时内无法添加它。胡扯。。。简短的版本是,我现在将我的渲染后端更改为“TkAgg”,直到我能想出如何让Qt4Agg以我喜欢的方式运行。很好!我不知道。。。我使用的后端(主要是TkAgg)在调用show时不会破坏图形。我不知道有人这么做了。当你调用
figure(figures[fig].number)
时,我突然想到你正在清除这个数字。不管怎样,我发现坚持使用OO界面而不依赖于激活图形要容易得多。顺便说一句,当你解决了自己的问题时,你应该将你的答案标记为正确。这样做是完全可以接受的,尽管我相信你必须等2天才能把自己的答案标记为被接受的答案。是的,它告诉我我还有23个小时来标记自己的答案。
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)