前言:
前一篇博客完成了经纬度画图的代码设计,现在需要批量生成不同路的图片,共计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)