2016-08-16 24 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