import ast
from math import sqrt
import matplotlib.pyplot as plt
import numpy as np
import random
import csv
json_file_path01 = r'C:\\Users\\Documents\\output\\output_data.txt'
json_file_path02 = r'C:\\Users\\Documents\\output\\output_nodata.txt'
def read_json(file_path,flag):
"""从json文件中读取数据"""
list_x,list_y,tup_list = [],[],[]
with open(file_path,'r',encoding='utf-8') as f:
for data in f.readlines():
dict_data = ast.literal_eval(data)
s_error = abs(dict_data.get("s_error"))
s_sim = dict_data.get("s_sim")
s_exp = dict_data.get("s_exp")
error_x = abs(dict_data.get("error_x"))
error_y = abs(dict_data.get("error_y"))
if flag == 's_error':
output_data_x = s_error/max(s_sim,s_exp)
output_data_y = sqrt(error_x**2+error_y**2)/max(s_sim,s_exp)
elif flag == 'xy_error':
output_data_x = error_x/max(s_sim,s_exp)
output_data_y = error_y/max(s_sim,s_exp)
list_x.append(output_data_x)
list_y.append(output_data_y)
tup_list.append((output_data_x,output_data_y,))
return list_x,list_y,tup_list
infos_list = []
def get_cav_datas(contents,region):
"""获取csv数据信息"""
list_r_x,list_r_y,tup_r_list = read_json(json_file_path01,contents)
red_xys = [tup_li for tup_li in tup_r_list if 0<=tup_li[0]<=region and 0<=tup_li[1]<=region]
list_g_x,list_g_y,tup_g_list = read_json(json_file_path02,contents)
green_xys = [tup_li for tup_li in tup_g_list if 0<=tup_li[0]<=region and 0<=tup_li[1]<=region]
name_str = contents + " region: " + str(region) +",红点个数:{},百分比:{:.2%};绿点个数:{},百分比:{:.2%}".format(len(red_xys),len(red_xys)/len(list_r_x),len(green_xys),len(green_xys)/len(list_g_x))
infos = []
infos.append(contents)
infos.append(region)
infos.append(len(red_xys))
infos.append(str(round((len(red_xys)/len(list_r_x))*100,2))+'%')
infos.append(len(green_xys))
infos.append(str(round((len(green_xys)/len(list_g_x))*100,2))+'%')
infos.append(name_str)
infos_list.append(infos)
def plt_contents(num,contents,region):
plt.figure(num=num, figsize=(15,9),dpi=80)
plt.xlim(0,region)
plt.ylim(0,region)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.xlabel('X',fontsize=12)
plt.ylabel('Y',fontsize=12)
"""注意:在read_json()函数中同时修改为data或者nodata分别画出两张图,即为所需"""
list_r_x,list_r_y,tup_r_list = read_json(json_file_path01,contents)
plt.scatter(list_r_x,list_r_y,c="none",edgecolors='r',marker='o')
red_xys = [tup_li for tup_li in tup_r_list if 0<=tup_li[0]<=region and 0<=tup_li[1]<=region]
print(len(red_xys))
print(len(list_r_x))
list_g_x,list_g_y,tup_g_list = read_json(json_file_path02,contents)
plt.scatter(list_g_x,list_g_y,c='g',marker='.')
green_xys = [tup_li for tup_li in tup_g_list if 0<=tup_li[0]<=region and 0<=tup_li[1]<=region]
plt.legend(['data','nodata'])
name_str = contents + " region: " + str(region) +",红点个数:{},百分比:{:.2%};绿点个数:{},百分比:{:.2%}".format(len(red_xys),len(red_xys)/len(list_r_x),len(green_xys),len(green_xys)/len(list_g_x))
plt.title(name_str,fontsize=12)
plt.show()
def write_csv(datas,save_path):
headers = ['error_type','region','红点个数','红点百分比','绿点个数','绿点百分比','一句话总结']
with open(save_path,'a',encoding='utf-8',newline='') as f:
writter = csv.writer(f)
writter.writerow(headers)
writter.writerows(datas)
if __name__ == '__main__':
contents = 'xy_error'
reg_list = np.linspace(0.01,0.1,10)
for region in reg_list:
plt_contents(1,contents,round(region,2))
for region in reg_list:
get_cav_datas(contents,round(region,2))
write_csv(infos_list,r'C:\\Users\\Documents\\output\\data1.csv')
