1

我遇到了一个 python 错误,我已经尝试解决好几天了。我的程序创建数字,保存并关闭它们,除了这个错误之外工作正常。通常它不会妨碍保存过程,但有时保存时图片会丢失下部。奇怪的是,这种情况只会在循环到达 savefig 方法时每秒钟发生一次,这是我的代码:

for num in np.arange(file_number):
    plt.figure('abc' + str(num),figsize=(22,12),dpi=100)
    #some plots are added to the figure
    print 1
    plt.savefig(os.path.join(savepath,filename),dpi=100)
    print 2
    plt.close()                                                                    
    print 3

我使用打印命令查看错误发生的位置。这是 spyder 的控制台输出:

Reading file1.file
1
2
3
Reading file2.file
1
Traceback (most recent call last):
  File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_qt4.py", line 151, in <lambda>
    lambda: self.close_event())
  File "/usr/lib/pymodules/python2.7/matplotlib/backend_bases.py", line 1564, in close_event
    self.callbacks.process(s, event)
RuntimeError: underlying C/C++ object has been deleted
2
3
Reading file3.file
1
2
3
Reading file4.file
1
Traceback (most recent call last):
  File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_qt4.py", line 151, in <lambda>
    lambda: self.close_event())
  File "/usr/lib/pymodules/python2.7/matplotlib/backend_bases.py", line 1564, in close_event
    self.callbacks.process(s, event)
RuntimeError: underlying C/C++ object has been deleted
2
3

据我了解,在保存图形时(每第二次)已经发生了错误,尽管如果我省略 close() 命令它工作正常。在这种情况下,我的 RAM 在大约 70 个文件后被填满,有时我需要评估数百个文件。这就是为什么我需要包含 close() 命令或类似的东西。如果您解决了这个问题(或改进了我的编程,我想我保存和关闭的方式可能被认为是丑陋的)请帮助我。

4

2 回答 2

0

如何将后端更改为其他选项?例如:

import matplotlib as mpl
mpl.use( "agg" )

from matplotlib import pyplot as plt
import numpy as np

print plt.get_backend()

file_number = 100
for num in np.arange(file_number):
    plt.figure('abc' + str(num),figsize=(22,12),dpi=100)
    #some plots are added to the figure
    print 1
    plt.savefig("%d.png" % num,dpi=100)
    print 2
    plt.close()
    print 3
于 2012-07-27T02:42:19.200 回答
0

我无法复制您的问题(部分原因是您的示例不是自包含的),但我认为您可以考虑解决稍微不同的问题。

由于您的图形定义(大小、dpi 等)在整个循环中保持不变(即使没有),您可以查看只生成一个图形,并在循环内更新它:

import matplotlib as mpl
mpl.use( "tkagg" )

from matplotlib import pyplot as plt
import numpy as np


file_number = 1000
fig = plt.figure('abc', figsize=(22,12), dpi=100)

plt.show(block=False)

for num in np.arange(file_number):
    fig.set_label('abc%s' % num)

    # add an axes to the figure
    ax = plt.axes()

    #some plots are added to the figure (I just plotted a line)
    plt.plot(range(num))

    plt.savefig("%d.png" % num, dpi=100)
    # draw the latest changes to the gui
    plt.draw()

    # remove the axes now that we have done what we want with it.
    fig.delaxes(ax)

# put in a blocking show to wait for user interaction / closure.
plt.show()

通常这不是您做事的方式(我通常会更新轴而不是每次都添加/删除轴),但也许您有充分的理由这样做。

这应该会显着提高性能。

于 2012-07-27T17:08:32.790 回答