这是接着上次 “如何diy一个uvm框架 ” 的实战延续,uvm生成完对比数据后,就要用python绘制出相应的条形图,方便直接观察。
关于能根据什么数据绘制条形图,这个我想了很久,目前只想到带宽波动和长度波动,其他答案麻烦在评论区回复,十分感谢!
网上关于绘制条形图大多都是调用matplotlib库,然后巴拉巴拉一堆,确实结果不错,感觉还是很香的,下图是网上随便截取的一个,你们看看就好。
但是我会这样简单的抄作业吗?可以,但没必要。公司中很多都是不联网的环境,哪里给你用这个库,思考了一会,感觉条形图不会很难,那就手撸一个吧,话不多说,正式开始:
分析上图,就是两个for循环,然后按像素点打印一组组数据,由于条形图顶部肯定有空余,那就要设置max值,贴出部分代码段:
max_yaxix_width = 25
x_buf= ""
y_buf= ""
idle_buf=" "
blank_buf=" "
blank=blank_buf+idle_buf
print("\n ★★★★★★★★★◣︻◢★★★★★★★★★★★★★★★◣︻◢★★★★★★★★★★★★★★◣︻◢★★★★★★★★★★")
print(" ★★★★★★★★★★★★★★★★★★★★★测 试 结 果★★★★★★★★★★★★★★★★★★★★★★")
print(" ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n")
#and and x==len(x_axis)-1 and int(y)==int(y_axis[len(y_axis)-1])
for g in range(max_yaxix_width,-1,-1):
for x in range(0,len(x_axis)):
if int(math.ceil(int(y_axis[x])/multiple_reduction))>=g :
#print(" g="+str(g)+" x="+str(x)+" y="+y_axis[x] )
y_buf = y_buf +idle_buf+"▇"
else :
y_buf = y_buf + blank
#print(" g="+str(g)+" x="+str(x)+" y="+y_axis[x] )
if x==len(x_axis)-1 :
y_buf = y_buf + "\n"
print(y_buf)
到这里就完了吗?不不不,我的智商不允许我这么草率的结束,参数和数据肯定能从外部文本设置才能完美融入UVM中,所以又经过一点点小修改,读取外部文本数据,抠出字符,贴出对应代码段:
#对log分析:
def get_data(txt):
global x_axis
global y_axis
x_axis =[]
y_axis =[]
with open(txt,'r',encoding='utf-8') as file:
for line in file.readlines():
mid_buf=" ".join(line.split())
x_axis.append(mid_buf.split(' ')[0])
y_axis.append(mid_buf.split(' ')[1])
def get_config(txt):
global max_name_width
global multiple_reduction
with open(txt,'r',encoding='utf-8') as file:
for line in file.readlines():
mid_buf=" ".join(line.split())
if "max_name_width" in mid_buf:
max_name_width =int(mid_buf.split('=')[1])
if "multiple_reduction" in mid_buf:
multiple_reduction =int(mid_buf.split('=')[1])
ok,看下结果吧,结果好才是真的好,结果如下图:
结果还是不错的,你以为这里就结束了吗?不不不,又竖着的条形图,那就有横着的条形图,于是我去厕所找灵感,花了几分钟,灵感爆棚,又for了一次,代码段如下:
print("\n ★★★★★★★★★◣︻◢★★★★★★★★★★★★★★★◣︻◢★★★★★★★★★★★★★★◣︻◢★★★★★★★★★★")
print(" ★★★★★★★★★★★★★★★★★★★★★测 试 结 果★★★★★★★★★★★★★★★★★★★★★★")
print(" ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n")
for i in range(0,len(x_axis)):
for j in range(0,math.ceil(int(y_axis[i])/multiple_reduction)):
if j==0:
x_buf = " "+str(x_axis[i])+":"
idle=max_name_width-len(x_axis[i])
idle =idle*2
for x in range(0,idle):
x_buf = x_buf+" "
x_buf = x_buf + "▇"
print(x_buf+ " "+str(y_axis[i]))
print("\n")
ok,再看下结果吧,结果好才是真的好,咦,好像之前说过了,结果如下图:
好吧,结果还是不错的,手撸实现了两种条形图,代码我放出来,花了我周末才写完的,麻烦关注支持一下,更新不易,且珍惜!
完整代码/
代码结构:
config.txt文件:
max_name_width = 6
multiple_reduction = 1
data.txt文件:
葡萄 20
手机 10
电脑架子 20
西红柿 10
梨 5
苹果 6
手机 10
电脑架子 20
西红柿 10
梨 5
苹果 6
手机 10
西红柿 10
梨 5
手机 10
电脑架子 20
西红柿 10
梨 5
苹果 6
main.py文件:
import sys
import os
import math
max_name_width = 5
multiple_reduction = 2
x_axis = ["西红柿", "梨","苹果","哈密瓜汁"]
y_axis = [40, 15, 20, 100]
#对log分析:
def get_data(txt):
global x_axis
global y_axis
x_axis =[]
y_axis =[]
with open(txt,'r',encoding='utf-8') as file:
for line in file.readlines():
mid_buf=" ".join(line.split())
x_axis.append(mid_buf.split(' ')[0])
y_axis.append(mid_buf.split(' ')[1])
def get_config(txt):
global max_name_width
global multiple_reduction
with open(txt,'r',encoding='utf-8') as file:
for line in file.readlines():
mid_buf=" ".join(line.split())
if "max_name_width" in mid_buf:
max_name_width =int(mid_buf.split('=')[1])
if "multiple_reduction" in mid_buf:
multiple_reduction =int(mid_buf.split('=')[1])
def y_gui():
global max_name_width
global multiple_reduction
global x_axis
global y_axis
print("\n ★★★★★★★★★◣︻◢★★★★★★★★★★★★★★★◣︻◢★★★★★★★★★★★★★★◣︻◢★★★★★★★★★★")
print(" ★★★★★★★★★★★★★★★★★★★★★测 试 结 果★★★★★★★★★★★★★★★★★★★★★★")
print(" ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n")
for i in range(0,len(x_axis)):
for j in range(0,math.ceil(int(y_axis[i])/multiple_reduction)):
if j==0:
x_buf = " "+str(x_axis[i])+":"
idle=max_name_width-len(x_axis[i])
idle =idle*2
for x in range(0,idle):
x_buf = x_buf+" "
x_buf = x_buf + "▇"
print(x_buf+ " "+str(y_axis[i]))
print("\n")
def x_gui():
global multiple_reduction
global x_axis
global y_axis
max_yaxix_width = 25
x_buf= ""
y_buf= ""
idle_buf=" "
blank_buf=" "
blank=blank_buf+idle_buf
print("\n ★★★★★★★★★◣︻◢★★★★★★★★★★★★★★★◣︻◢★★★★★★★★★★★★★★◣︻◢★★★★★★★★★★")
print(" ★★★★★★★★★★★★★★★★★★★★★测 试 结 果★★★★★★★★★★★★★★★★★★★★★★")
print(" ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n")
#and and x==len(x_axis)-1 and int(y)==int(y_axis[len(y_axis)-1])
for g in range(max_yaxix_width,-1,-1):
for x in range(0,len(x_axis)):
if int(math.ceil(int(y_axis[x])/multiple_reduction))>=g :
#print(" g="+str(g)+" x="+str(x)+" y="+y_axis[x] )
y_buf = y_buf +idle_buf+"▇"
else :
y_buf = y_buf + blank
#print(" g="+str(g)+" x="+str(x)+" y="+y_axis[x] )
if x==len(x_axis)-1 :
y_buf = y_buf + "\n"
print(y_buf)
x_buf = " "
for x in range(0,len(x_axis)):
x_buf = x_buf+x_axis[x]+" "
print(x_buf)
def main():
get_config("config.txt")
get_data("data.txt")
x_gui()
if len(sys.argv) < 2 :
main()
谢谢观看!!!!