2016-08-16 40 views
0

我試圖在代碼循環中打印一系列圖像。我最終需要打印大約1000張以顯示我的系統隨時間變化的方式。我已經回顧了Matplotlib runs out of memory when plotting in a loop中概述的方法,但我仍然無法讓代碼生成超過96張圖片。在循環中繪製數字時的Python內存

我正在使用它的剝出的形式的代碼是下面

import numpy as np 
import matplotlib as mpl 
import os 
def pltHM(graphname,graphtext,xAxis,yAxis,xMn,xMx,xCnt,yMn,yMx,yCnt,TCrt):  
    plt = mpl.pyplot  
    fig = plt.figure(figsize=(8,7), dpi=250) 
    cmap = mpl.cm.jet 
    norm = mpl.colors.Normalize(vmin=-3, vmax=3)   
    X = np.linspace(xMn,xMx,xCnt) 
    Y = np.linspace(yMn,yMx,yCnt) 
    plt.xlabel(xAxis) 
    plt.ylabel(yAxis) 
    plt.pcolormesh(X,Y,TCrt, cmap=cmap,norm=norm) 
    plt.grid(color='w') 
    plt.suptitle(graphtext, fontsize=14) 
    plt.colorbar() 
    plt.savefig(graphname, transparent = True) 
    plt.cla() 
    plt.clf()  
    plt.close(fig) 
    del plt  
    del fig 
    return 

這在一個簡單的循環使用如下所示

for loop1 in range(0,10): 
    for loop2 in range(0,100): 
     saveName = 'Test_Images/' + str(loop1) + '_' + str(loop2) + '.png'   
     plotHeatMap(saveName,'Test','X','Y',-35,35,141,-30,30,121,Z) 

上爲什麼上面沒有釋放內存任何意見並導致追溯消息

RuntimeError:無法爲映像分配內存

非常感謝您提供的任何幫助

+1

提示:您不必在循環中創建新圖形。將圖形*一次*,然後在循環內*更新*繪圖並保存。此外,您每次都重新定義pyplot。 **不要這樣做**你只需要一次,只需'在頂部輸入matplotlib.pyplot as plt',並擺脫'plt = mpl.pyplot'有趣的業務。 – Ajean

+0

非常感謝。我現在已經把它解開了,並且在畫布上使用了病態人士的建議。工作中。非常感謝 – ultimatejo

回答

1

以下是您可以做的一個簡單例子。正如Ajean所指出的,你不應該每次都像你一樣進口plt!這足夠一次。另外,不要刪除圖形並創建一個新的圖形...最好使用相同的圖形,只需替換數據即可。

import numpy as np 
import matplotlib.pyplot as plt 

def plotHeatMap(fig, line, x, y, graphname): 
    line.set_data(x, y) 
    fig.canvas.draw() 
    fig.savefig(graphname) 

fig1, ax1 = plt.subplots(1, 1) 
line, = ax1.plot([],[]) 
ax1.set_xlim(0, 1) 
ax1.set_ylim(0, 1) 
for loop1 in range(0, 2): 
    for loop2 in range(0, 2): 
     x = np.random.random(100) 
     y = np.random.random(100) 
     save_name = 'fig_'+str(loop1) + '_' + str(loop2) + '.png' 
     plotHeatMap(fig1, line, x, y, save_name) 
+0

非常感謝您的建議。已將其設置爲在畫布上重繪,現在正在工作。它現在也更快以及完成。我非常感謝你的幫助。 – ultimatejo