python3 plt点状图

153 阅读2分钟
#/usr/bin/python3
# -*- encoding: utf-8 -*-

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():
            #将str转化为dict
            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':
                #分别获取点的x,y坐标
                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)    
    #设定x,y轴的区间
    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.savefig(r"C:\\Users\\Documents\\output\\" + name_str + '_' + str(''.join(random.sample('abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ',6))) + "_.jpg")
    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__':
    #part 1
    # contents = 's_error'
    #part 2
    contents = 'xy_error'
    #显示生成点状图片
    reg_list = np.linspace(0.01,0.1,10)
    for region in reg_list:
        plt_contents(1,contents,round(region,2))
    #数据信息写入csv文件
    for region in reg_list:
        get_cav_datas(contents,round(region,2))

    write_csv(infos_list,r'C:\\Users\\Documents\\output\\data1.csv')

s_error,红点个数:125,百分比:69.44%;绿点个数:82,百分比:45.56%Akln1h.jpg