Matplotlib:解决批量制图时的内存不够问题(Out of memory)

前言:

前一篇博客完成了经纬度画图的代码设计,现在需要批量生成不同路的图片,共计2000多张。
但是在画图时,画到50张就会内存达到100%,且出现“MemoryError: In RendererAgg: Out of memory”的错误。
在网上找了一些帖子,有人说把fig = plt.figure() 放在for循环的外面,同时在每次循环开始阶段,加入plt.cla()(清除当前图形中的当前活动轴)即可。我尝试了一下的确可以,但问题是我每张图的大小都是不一致的,也就是plt.figure里我需要设置figsize。
后来自己试验了一下,把fig=plt.figure(figsize=(a, b))放在循环里面,最后加一句plt.close(fig)也是可以成功的。

代码:

import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_csv('复赛标准地址库.csv', sep='\t', dtype={'locationx':'str', 'locationy':'str', 'street_num':'str', 'street':'str', 'township':'str'})
hedui = pd.read_excel('需核对.xlsx')
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

for i in range(hedui.shape[0]):
    # print(i)
    province = hedui.iloc[i,0]
    city = hedui.iloc[i,1]
    district = hedui.iloc[i,2]
    township = hedui.iloc[i,3]
    street = hedui.iloc[i,4]
    file_name = province + city + str(district) + str(township) + str(street)
    temp_data = data[(data['province']==province)&(data['city']==city)&(data['district']==district)&(data['township']==township)&(data['street']==street)]
    #经度的上下限
    x_list = temp_data['locationx'].value_counts().index.to_list()
    x_num_list = [float(x) for x in x_list]
    max_lng = round((round(max(x_num_list),4)+0.0003),4)
    min_lng = round((round(min(x_num_list),4)-0.0003),4)
    range_lng = round(max_lng-min_lng,4)*2000

    #纬度的上下限
    y_list = temp_data['locationy'].value_counts().index.to_list()
    y_num_list = [float(y) for y in y_list]
    max_lat = round((round(max(y_num_list),4)+0.0003),4)
    min_lat = round((round(min(y_num_list),4)-0.0003),4) #min_lat = round((round(min(y_num_list),2) - 0.01),2)
    range_lat = round(max_lat-min_lat,4)*2000

    #获得各个点的列表
    name_list = temp_data.iloc[:,5].to_list()
    lng_list = temp_data.iloc[:,6].to_list()
    lat_list = temp_data.iloc[:,7].to_list()

    #画图
    fig = plt.figure(figsize=(range_lng, range_lat))  # 绘制画布 #range_lng,range_lat
    plt.xlim(min_lng, max_lng) #设定X轴的区间
    plt.ylim(min_lat, max_lat) #设定y轴的区间
  
    for text, lng, lat in zip(name_list,lng_list,lat_list):
        plt.plot(float(lng), float(lat), '.')
        plt.annotate(text, (float(lng), float(lat)))

    plt.savefig('C:\\Users\\Administrator\\Desktop\\四川位置信息识别\\复赛\\批量画图\\' + file_name + '.png', dpi=300)
    plt.close(fig)

你可能感兴趣的:(matplotlib,python,可视化)