概述
在画大量子图的时候会出现内存溢出错误
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
类提供用于清除数字的方法。我将在下面假设fig
是Figure
:
fig.clf()
清除整个数字这个电话相当于plt.clf()
只有当fig
是目前的数字。
fig.clear()
的同义词fig.clf()
请注意,即使“del fig
”也不会关闭相关的数字窗口。 据我所知,关闭数字窗口的唯一方法是使用plt.close(fig)
,综上所述。
最后
以上就是眼睛大台灯为你收集整理的matplotlib内存溢出报错的全部内容,希望文章能够帮你解决matplotlib内存溢出报错所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复