matplotlib内存溢出报错

在画大量子图的时候会出现内存溢出错误

import matplotlib
matplotlib.use('Agg')
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import os
from sklearn.decomposition import PCA
import sys
#np.set_printoptions(threshold='nan')

#数据预处理
df = pd.read_csv(sys.argv[1],sep = ',')
df.set_index('Wave',inplace=True)
df = df.reindex(sorted(df.index))
y = np.zeros(200)
y[:49]=0
y[49:99]=1
y[99:150]=2
y[150:]=3

#PCA
colors = ['navy', 'turquoise','darkorange','yellow']
target_names = ['P+','N-','P-','Z+']
wave_lengths = range(4,21)  # 选择波段范围
for wave_length in wave_lengths:
    for i in range(400,2000):
        test = df.T.iloc[:, i:i+wave_length]
        left = test.columns[0]  # 左端波长  left wave_length
        right = test.columns[-1]# 右端波长  right wave length
        pca = PCA(n_components= 3)
        x_pca = pca.fit_transform(test)# pca fit and transform
        x_pca[x_pca >2] = 2  
        x_pca[x_pca <-20] = -20
        for pc_number in ([0,1],[1,2],[0,2]):
            plt.figure(figsize=(20,10))
            for color,i,target_name in zip(colors, [0,1,2,3],target_names):
                plt.scatter(x_pca[y==i,pc_number[0]], x_pca[y==i,pc_number[1]], alpha=.8, color = color,
                               label = target_name)
            plt.legend(loc = 'best', shadow = False, scatterpoints = 1)
            plt.title('%s to %s PCA of raman' %(right,left))
            plt.xlabel('PC%s is %.2f%%' %(pc_number[0],pca.explained_variance_ratio_[pc_number[0]] * 100))
            plt.ylabel('PC%s is %.2f%%'  %(pc_number[1],pca.explained_variance_ratio_[pc_number[1]]  * 100))
            plt.savefig("./400-2000/%s to %s.png" %(right,left))

            #plt.show()

原因就是没有去掉plt的内存 ,在loop的后面加上plt.close()就能解决这个问题

stackoverflow 看到了另外的方法

while True:
    fig = pyplot.figure()
    ax = fig.add_subplot(111)
    ax.plot(x,y)
    ax.legend(legendStrings, loc = 'best')
    fig.savefig('himom.png')
    #new bit here
    pylab.close(fig) #where f is the figure

但是不知道为什么while True没有跟break

cla()、clf()或CLOSE()的 区别

它们都做不同的事情,因为matplotlib使用分层次序,其中一个数字窗口包含一个可能由许多轴组成的图形。此外,还有来自pyart接口的函数,并且在Figure类里。我将在下面讨论这两种情况。

pyplote接口

pyplot是一个模块,它收集了一些允许matplotlib以功能方式使用的函数。 我在这里假设pyplot已被导入为“import matplotlib.pyplot as plt”。 在这种情况下,有三个不同的命令可以删除内容:

plt.cla()清除轴,当前活动轴在当前图中。 它保持其他轴不变。

plt.clf()清除整个当前数字。与所有的轴,但离开窗口打开,这样它就可以再用在其他的 plots上了。

plt.close()关上窗户,如果未另指定,则该窗口将是当前窗口。

因此,哪种功能最适合您,取决于您的用例。

close()函数还允许指定哪个窗口应该关闭。参数可以是使用figure(number_or_name)创建的窗口的数字或名称。也可以是获得的图形实例,即使用fig = figure()。如果没有人提出任何论点close(),当前活动的窗口将关闭。 此外,还有语法close('all'),它关闭所有数字。

Figure的方法

此外,Figure类提供用于清除数字的方法。我将在下面假设figFigure:

fig.clf()清除整个数字这个电话相当于plt.clf()只有当fig是目前的数字。

fig.clear()的同义词fig.clf()

请注意,即使“del fig”也不会关闭相关的数字窗口。 据我所知,关闭数字窗口的唯一方法是使用plt.close(fig),综上所述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值