python画折线图,曲线图

import matplotlib.pyplot as plt

input_txt = 'New_Text_Document_pro.txt'

f = open(input_txt)
x = []
y = []
for line in f:
    line = line.strip('\n')
    line = line.split(' ')
    x.append('%03d' % int(line[0].split(':')[1]))
    # y.append(float(line[1].split(':')[1]))
    y.append(float(line[2].split('=')[1].replace('%', '')))


f.close

plt.plot(x, y, marker='o', label='lost plot')
plt.xticks(x[0:len(x):10], x[0:len(x):10], rotation=45)
plt.margins(0)
plt.xlabel("train step")
# plt.ylabel("avg_loss")
plt.ylabel("Accuracy")
plt.title("matplotlip plot")
plt.tick_params(axis="both")
# plt.savefig("Epoch_Loss.jpg")
plt.savefig("Epoch_Accuracy.jpg")
plt.show()  # 注意plt.savefig()要放在plt.show()之前,不然保存的图片是空白的

以下是整理封装好的折线图画法:

import matplotlib.pyplot as plt

def x_y_data(txt_path):
	f = open(txt_path)
	content = f.readlines()
	x = []
	y_loss = []
	y_acc = []
	for i in range(0, 10):
	    line = content[i].strip('\n')
	    line = content[i].split(' ')
	    x.append('%03d' % int(line[0].split(':')[1]))
	    y_loss.append(float(line[1].split(':')[1]))
	    y_acc.append(float(line[2].split('=')[1].replace('%', '')))
	f.close
	return x, y_loss, y_acc


class make_picture(object):
	def __init__(self, tips):
		self.tips = tips
	
	def loss_pic(self, x, y_loss):
		plt.plot(x, y_loss, marker='o', label='lost plot')
		plt.xticks(x[0:len(x):10], x[0:len(x):10], rotation=45)
		plt.margins(0)
		plt.xlabel("Epoch")
		plt.ylabel("avg_loss")
		plt.title("matplotlip plot")
		plt.tick_params(axis="both")
		plt.savefig("Epoch_Loss.jpg")
		plt.show()
		print(self.tips)

	def acc_pic(self, x, y_acc):
		plt.plot(x, y_acc, marker='o', label='lost plot')
		plt.xticks(x[0:len(x):10], x[0:len(x):10], rotation=45)
		plt.margins(0)
		plt.xlabel("Epoch")
		plt.ylabel("Accuracy")
		plt.title("matplotlip plot")
		plt.tick_params(axis="both")
		plt.savefig("Epoch_Accuracy.jpg")
		plt.show()
		print(self.tips)
		
	def acc_pic2(self, x, y_acc):
		x_label = range(0, 201, 10)
		y_label = range(0, 101, 10)
		override = {
			'fontsize': '13',
			'verticalalignment': 'center',
			'horizontalalignment': 'center',}
			# 'rotation' : 'vertical'}
		plt.plot(x, y_acc)  #marker='o', label='lost plot'
		plt.xticks(x_label, rotation=45)
		plt.xlim(0, 210) #控制x的范围,可以让x,y零点重合
		plt.yticks(y_label)
		#plt.margins(0)
		plt.xlabel("Epoch", override)
		plt.ylabel("Accuracy(%)")
		# plt.title("matplotlip plot")
		plt.tick_params(axis="both")
		plt.savefig("Epoch_Accuracy.jpg")
		plt.show()
		print(self.tips)
		
if __name__ == '__main__':
	txt_path = 'New_Text_Document_pro.txt'
	tips = 'The picture has done!'
	x, y_loss, y_acc = x_y_data(txt_path)
	PIC = make_picture(tips)
	PIC.loss_pic(x, y_loss)
	PIC.acc_pic(x, y_acc)

以下是整理封装好的曲线图画法:

import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import spline
import json, time


def test():
    ###################
    a  = [2,3,5,6,7]
    for i in a:
        num = np.sum(list(map(lambda x: x <= i, a)))
        # print(i, 'num: ', num)
    ###################
    for i in np.arange(0, 0.51, 0.05):
        num = '%.2f' % i
        # print(num)
    ###################
    b = np.array([1,2,3,4,5])
    print('b lenth: ', len(b), b[0])


def percentage(txt_path, json_path):  #得到y轴数据:数据的百分比
    f = open(txt_path)
    # f_distance = open(distanse_txt_path, 'w')
    # f_per = open(per_txt_path, 'w')
    lines = f.readlines()
    distanse_list = []
    for line in lines:
        # f_distance.write(line.split(',')[0])
        distanse_list.append(float(line.split(',')[0]))
    distanse_array = np.array(distanse_list)
    # per_list = []
    per_result = {}
    for i in np.arange(0, 0.51, 0.05):
        x_index = float('%.2f' % i)
        num = np.sum(list(map(lambda x: x <= x_index, distanse_list)))
        per = num/len(distanse_list)
        # f_per.write(per)
        # per_list.append(per)
        per_result[x_index] = per
    json_str = json.dumps(per_result)
    with open(json_path, 'w') as json_file:
        json_file.write(json_str)
    # per_array = np.array(per_list)
    # return distanse_array, per_array

#绘制曲线图
def curve_pic(json_path, save_path):
    f = open(json_path)
    x_list = []
    per_list = []
    per_result = json.load(f)
    for k_x, v_per in per_result.items():
        x_list.append(k_x)
        per_list.append(v_per)
    x_data = np.array(list(map(float, x_list)))
    y_data = np.array(list(map(float, per_list))) * 100
    y_ticks = np.arange(0, 101, 10)
    xnew = np.linspace(x_data.min(),x_data.max(),300) #300 represents number of points to make between T.min and T.max
    power_smooth = spline(x_data,y_data,xnew)
    x_new_data = []
    x_data = list(x_data)
    for i in range(len(x_data)):
        if i == 0:
            x_new_data.append(0)
        else:
            x_new_data.append(x_data[i])

    plt.plot(xnew,power_smooth)
    plt.xticks(x_new_data[0:], x_new_data[0:])
    plt.yticks(y_ticks[0:], y_ticks[0:])
    plt.xlim(0, 0.5)
    plt.ylim(0, 100)
    plt.title('PCK total')
    plt.xlabel('Normalized distance')
    plt.ylabel('Detection rate(%)')
    plt.savefig(save_path)
    plt.show()


def per_range(txt_path):
    f = open(txt_path)
    lines = f.readlines()
    distanse_list = []
    for line in lines:
        distanse_list.append(float(line.split(',')[0]))
    num_1 = 0
    num_2 = 0
    num_3 = 0
    num_4 = 0
    num_5 = 0
    for i in distanse_list:
        if i <= 0.1:
            num_1 += 1
        if i <= 0.2:
            num_2 += 1
        if i <= 0.3:
            num_3 += 1
        if i <= 0.4:
            num_4 += 1
        if i <= 0.5:
            num_5 += 1
    total = len(distanse_list)
    per_1 = num_1 / total
    per_2 = num_2 / total
    per_3 = num_3 / total
    per_4 = num_4 / total
    per_5 = num_5 / total
    print('%.5f' % per_1)
    print('%.5f' % per_2)
    print('%.5f' % per_3)
    print('%.5f' % per_4)
    print('%.5f' % per_5)
    print(per_1+per_2+per_3+per_4+per_5)


def per_15_range(txt_path):
    f = open(txt_path)
    lines = f.readlines()
    dict_1 = {}
    dict_2 = {}
    dict_3 = {}
    dict_4 = {}
    dict_5 = {}
    dict_15 = {}
    for index in range(0, 16):
        num = 0
        num_1 = 0
        num_2 = 0
        num_3 = 0
        num_4 = 0
        num_5 = 0
        for line in lines:
            rate = float(line.split(',')[0])
            id = int(line.split(',')[1])
            if id == index:
                num += 1
                if rate <= 0.1:
                    num_1 += 1
                if rate <= 0.2:
                    num_2 += 1
                if rate <= 0.3:
                    num_3 += 1
                if rate <= 0.4:
                    num_4 += 1
                if rate <= 0.5:
                    num_5 += 1
        dict_15[index] = num
        dict_1[index] = num_1
        dict_2[index] = num_2
        dict_3[index] = num_3
        dict_4[index] = num_4
        dict_5[index] = num_5
    per_1_dict = {}
    per_2_dict = {}
    per_3_dict = {}
    per_4_dict = {}
    per_5_dict = {}
    for k_index, v_number in dict_15.items():
        per_1_dict[k_index] = dict_1[k_index] / v_number
        per_2_dict[k_index] = dict_2[k_index] / v_number
        per_3_dict[k_index] = dict_3[k_index] / v_number
        per_4_dict[k_index] = dict_4[k_index] / v_number
        per_5_dict[k_index] = dict_5[k_index] / v_number
    print('per_0.1: ', per_1_dict)
    print('per_0.2: ', per_2_dict)
    print('per_0.3: ', per_3_dict)
    print('per_0.4: ', per_4_dict)
    print('per_0.5: ', per_5_dict)


def json_data(json_path):
    f = open(json_path)
    json_file = json.load(f)
    print(type(json_file))
    print(len(json_file.keys()))
    print(len(json_file.values()))
    print(json_file.keys())

if __name__ == '__main__':
    txt_path = '/home/jianghusanren/Pictures/FX/4/pckh.txt'  # pckh.txt
    # distanse_txt_path = '/home/jianghusanren/Pictures/FX/4/pckh_distanse.txt'
    # per_txt_path = '/home/jianghusanren/Pictures/FX/4/pckh_per.txt'
    pic_save_path = '/home/jianghusanren/Pictures/FX/4/PCK_total.jpg'
    json_path = '/home/jianghusanren/Pictures/FX/4/pckh_dis_per_2.json'
    statt = time.time()
    # test()
    # per_15_range(txt_path)
    # per_range(txt_path)
    # percentage(txt_path, json_path)
    # json_data(json_path)
    curve_pic(json_path, pic_save_path)
    end = time.time()
    # print(end - statt)
发布了36 篇原创文章 · 获赞 1 · 访问量 2157

猜你喜欢

转载自blog.csdn.net/jianghusanren3/article/details/96428292
今日推荐