为了配合实验研究写的代码,临时学了一下matplotlib,感觉学到一些知识点,复盘一下,最近比较忙,先上代码。
一、txt文档初步处理
// An highlighted block # 此代码功能:初始化文件的数据格式,修改标点 (#将:替换为空格 #将替换为空白 #将;替换为空格) # 与link chain 5代码配套使用 f = open("msg.txt", "r", encoding="utf-8") f_new = open("msg_new.txt", "w", encoding="utf-8") find_str1 = ":" find_str2 = "," find_str3 = ";" replace_str1 = " " replace_str2 = "" for line in f: if find_str1 in line: line = line.replace(find_str1, replace_str1) # 将 : 替换为空格 if find_str2 in line: line = line.replace(find_str2, replace_str2) # 将 ,替换为空白(即相邻端口写在一起) if find_str3 in line: line = line.replace(find_str3, replace_str1) # 将 ;替换为空格 f_new.write(line) print(line) f.close() f_new.close()
二、端口流量信息绘制
1.效果图
2.完整代码
// An highlighted block # 此代码功能:绘制一个端口的流量信息 import matplotlib.pylab as plt import math from pylab import * # 解决字体问题 mpl.rcParams['font.sans-serif'] = ['SimHei'] txt = open("historySCHED1_new.txt", "r", encoding="utf-8") # 打开链路时间文件 port = input("请输入端口名称port(如SW42SW52): ") # 1.将输入端口port的所有流量信息提取到数组x中 x = [] tt = [] order = [] pan1 = 0 pan2 = 0 pan3 = 0 for line in txt: pan3 = 1 ls = line.split() # 以空格为分隔符,将line中元素分隔开,变为ls(列表) for s in ls: if s == port: pan1 = 1 # 找到port时pan1为1 break # 排除掉下一个端口内的信息 if pan1 == 1: if (s[0] != "0") & (s[0] != "1") & (s[0] != "2") & (s[0] != "3") & (s[0] != "4") & (s[0] != "5") & (s[0] != "6") & (s[0] != "7") & (s[0] != "8") & (s[0] != "9") & (s[0] != "t"): pan2 = 1 # 当pan2为1时说明此端口内信息已经取完 if (pan1 == 1) & (pan2 != 1): if pan3 == 1: pan3 = 0 x.append(float(ls[0])), x.append(float(ls[1])) # 将端口的时间信息转化为数字添加到x中 tt.append(ls[2]) # 将端口的时间信息转化为数字添加到x中 order.append(ls[3]) # 将端口的时间信息转化为数字添加到x中 print("端口{}的流量为:".format(port)) for i in range(len(tt)): print("{} {} {} {}".format(x[2*i], x[2*i+1], tt[i], order[i])) length = len(tt) # 总信息条数 height = [] for i in range(length): # height.append(1) # 高度一样 # height.append(round((max(x)-x[2*i+1])/(x[1]-x[0]))) # 计算端口的高度,高度随时间递减 height.append(round(x[2*i+1] - x[2*i])) print("所有端口的高度为:{}".format(height)) # 2.绘制端口时间信息 for i in range(length): x_axis_data = [x[2*i], x[2*i], x[2*i+1], x[2*i+1]] # 通过绘制四个点来绘制折线 y_axis_data = [0, height[i]+1, height[i]+1, 0] plt.text(x[2*i]+5, height[i]+1.05, "{} {}".format(tt[i], order[i]), fontsize=5) # 绘制折线上的文字 plt.plot(x_axis_data, y_axis_data, label="{}第{}次".format(tt[i], order[i])) # label绘制图例 plt.xlabel("时间(us)") # x轴标题 plt.xticks(fontsize=5) # x轴数字大小 plt.title("端口 {} 的流量图".format(port)) # plt.savefig('link chain{}第{}次.jpg'.format(tt, order), dpi=1200) # 保存图片(此行要在绘制前面写) plt.legend(loc='upper right', prop={'size': 4}) plt.show() txt.close()
三、链路流量信息绘制
1.效果图
2.完整代码
// An highlighted block # 此代码功能:绘制同轴的时间信息图(幅度规律变化且能分开两条链路) import matplotlib.pylab as plt import math from pylab import * # 解决字体问题 mpl.rcParams['font.sans-serif'] = ['SimHei'] # 打开用test代码处理后的三个文档 txt1 = open("vls_new.txt", "r", encoding="utf-8") # 打开链路路径文件 txt2 = open("msg_new.txt", "r", encoding="utf-8") # 打开链路参数文件 txt3 = open("historySCHED1_new.txt", "r", encoding="utf-8") # 打开链路时间文件 pan1 = 0 # 为1代表找到链路端口 pan2 = 0 # 为1代表找到tt编号 tt = input("请输入tt编号(如tt3.0): ") order = input("请输入tt出现的次序(如3): ") # 1.搜索到tt编号对应的vl编号 for line in txt2: ls = line.split() # 以空格为分隔符,将line中元素分隔开,变为ls(列表) for s in ls: if s == tt: vl = ls[3] print("vl编号为:", vl) # 2.搜索到vl编号对应链路并且将链路端口信息输入到link中 for line in txt1: ls = line.split() # 以空格为分隔符,将line中元素分隔开,变为ls(列表) for s in ls: if s == vl: link = ls length = len(link)-1 print("链路为link:", link) print("链路长度length:", length) # 3.搜索链路端口对应的时间信息 x = [] for i in range(int(length)): for line in txt3: pan2 = 0 ls = line.split() # 以空格为分隔符,将line中元素分隔开,变为ls(列表) for s in ls: if s == link[i+1]: # 找到链路第一个端口 pan1 = 1 break if s == tt: # 找到端口内对应的tt编号所在行 pan2 = 1 if s == str(int(order)-1): # 找到对应的tt次序 if (pan1 == 1) and (pan2 == 1): # 找到对应tt编号并且找到tt出现的次序和端口的位置 pan1 = pan2 = 0 x.append(float(ls[0])), x.append(float(ls[1])) # 将端口的时间信息转化为数字添加到x中 print("链路第{}个端口 {} 第{}次出现为:{}".format(i + 1, link[i + 1], int(order), line)) break else: pan2 = 0 break txt3.seek(0) # 解决了文本txt3不能重复遍历的问题 print("链路所有的端口时间为 x:", x) # 4.绘制链路传输图 # # 计算端口高度相关思路的参数(此段代码可去除) # print('时间最大值和最小值为:', max(x), min(x)) # differance = max(x)-min(x) # print("最大值和最小值的时间差值为:", differance) # num = int(differance/(x[1]-x[0])) # print("较长链路端口个数为:", num) height = [] for i in range(length): height.append(round((max(x)-x[2*i+1])/(x[1]-x[0]))) # 计算端口的高度 print("所有端口的高度为:{}".format(height)) # 将端口高度因为链路重复引起的重合去除 height2 = height for i in range(length): for j in range(length-i-1): if height[i] == height2[j+i+1]: # 错位去重 height[i] = height[i]+0.5 # 将重复的端口高度加0.5 break print("去重后所有端口的高度为:{}".format(height)) # 绘制端口时间信息 for i in range(int(length)): x_axis_data = [x[2*i], x[2*i], x[2*i+1], x[2*i+1]] # 通过绘制四个点来绘制折线 y_axis_data = [0, height[i]+1, height[i]+1, 0] plt.text(x[2*i]+5, height[i]+1.05, "{}".format(link[i+1])) # 绘制折线上的文字 # 绘制点的坐标 plt.text(x[2*i]+2, height[i]+0.9, x[2*i], fontsize=5) # 绘制奇数点的坐标 plt.text(x[2*i+1]+2, height[i]+0.9, x[2*i+1], fontsize=5) # 绘制偶数点的坐标 # "{}{}{}".format(x[2*i], '\n', link[i+1]) #给坐标添加标签 # "{}{}{}".format(x[2*i+1], '\n', link[i+1]) # 0+0.45*(i % 2) # 坐标在底部时,上下位置区分 plt.plot(x_axis_data, y_axis_data, label=link[i+1], marker='>', markersize=3) # label绘制图例 plt.xlabel("时间(us)") # x轴标题 plt.xticks(fontsize=8) # x轴数字大小 plt.title("链路 {} {} 第{}次消息的流量图".format(vl, tt, order)) plt.legend() # plt.savefig('link chain{}第{}次.jpg'.format(tt, order), dpi=1200) # 保存图片(此行要在绘制前面写) plt.show() txt1.close() txt2.close() txt3.close()