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

print コマンドを使用して、エラーが発生した場所を確認します。スパイダーのコンソール出力は次のとおりです。

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

私の理解では、フィギュアの保存中に(2回ごとに)エラーがすでに発生していますが、close()コマンドを省略しても問題なく動作します。その場合、RAM は約 70 個のファイルでいっぱいになり、時には数百個のファイルを評価する必要があります。そのため、close() コマンドなどを含める必要があります。これを解決する場合(または私のプログラミングを改善する場合、この保存と終了の方法は醜いと見なされる可能性があると思います)、助けてください。

4

2 に答える 2

0

あなたの問題を再現することはできません (部分的には、あなたの例が自己完結型ではないためです) が、少し異なる問題の解決方法を検討できると思います。

Figure の定義 (サイズ、dpi など) はループ全体で同じままであるため (そうでない場合でも)、1 つの Figure だけを作成し、ループ内で更新することを検討できます。

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 に答える
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 に答える