xlsxwriter绘制散点图

一、背景:

为了统计服务器在不同并发请求数下响应的处理速度,对每一个请求的耗时进行了记录,后面将每个请求通过散点图表示出来,查看响应的分布状态。

txt文档格式,读取到excel后的展示。

   

二、流程解析

1.读取文件函数

使用f.readlines() 按行读取,最终返回一个列表,每行内容为一个列表中的元素。

2.最小和最大函数

因为excel中图表x轴需要一个浮点数,在excel中1:00:00 时间格式转换为数值为0.04147,所以首先取时间里面最小和最大的时间转换为浮点数为后面图表的范围做准备。

3. 画图函数

使用xlsxwriter只能创建,不能读取和修改文件。

首先使用worksheet.write方法写入原始数据,再通过workbook.add_chart方法添加图表。

三、xlsxwriter使用方法

 列宽度设置  worksheet.set_column('A:A', 20)

单元格样式设置  

bold=workbook.add_format({'bold':True})

worksheet.write('A1',headings[0],bold)

写数据方法(默认write写入为文本)

worksheet.write('A1',headings[0],bold)
worksheet.write_datetime(row,col,date_time,time_formats)
worksheet.write_number(row,col+1,int(content_line[1]))
图表系列设置
chart.add_series({
'name':['服务耗时统计',0,1],
'categories':['服务耗时统计',1,0,row,0],
'values':['服务耗时统计',1,1,row,1],
'marker': {'type': 'circle',
'size':2},
})
图表xy轴设置
chart.set_x_axis({
'name':'时间刻度',
'min':f_min,
'max':f_max,


})
chart.set_y_axis({
'name':'响应时间(ms)',
})

四、代码

import xlsxwriter
import datetime
# 数据读取
def read_txt():
    content=[]
    with open('./cptn1','r') as f:
        content_line=f.readlines()
    for content_row in content_line:
        content.append(content_row.strip('\n').split(','))

    return content
def min_max(content):
    # min=content[0][0].split(' ')
    # max=content[-1][0].split(' ')
    min=content[0][0].split(':')
    max=content[-1][0].split(':')
    print(min,max)
    result_min=list(map(int,min))
    result_max=list(map(int,max))
    hour = 0.04167
    minute=0.0007
    f_min=round(result_min[0]*hour+minute*result_min[1]-0.0001,5)
    f_max=round(result_max[0]*hour+minute*result_max[1]+0.0005,5)
    print(f_min,f_max)
    return f_min,f_max
def writetoexcel(f_min,f_max):
    content=read_txt()
    # print(content)
    workbook=xlsxwriter.Workbook('point_chart.xlsx')
    worksheet=workbook.add_worksheet('服务耗时统计')
    worksheet.set_column('A:A', 20)

    headings=['时间','总耗时','服务耗时']
    # 粗体形式
    bold=workbook.add_format({'bold':True})
    time_formats=workbook.add_format({'num_format':'hh:mm:ss'})
    # 首行标题添加
    worksheet.write('A1',headings[0],bold)
    worksheet.write('B1',headings[1],bold)
    worksheet.write('C1',headings[2],bold)

    # 内容
    col=0
    row=1
    for content_line in content:
        # 时间
        date_time=datetime.datetime.strptime(content_line[0],'%H:%M:%S')

        worksheet.write_datetime(row,col,date_time,time_formats)
        # 总耗时
        worksheet.write_number(row,col+1,int(content_line[1]))
        # 服务耗时
        worksheet.write_number(row,col+2,int(content_line[2]))
        row+=1

    # 图表添加
    chart=workbook.add_chart({'type':'scatter'})
    # straight_with_markers
    # straight
    # smooth_with_markers
    # smooth
    chart.set_size({'width':700,
                    'height':500})
    chart.add_series({
        'name':['服务耗时统计',0,1],
        'categories':['服务耗时统计',1,0,row,0],
        'values':['服务耗时统计',1,1,row,1],
        'marker': {'type': 'circle',
                   'size':2},
    })
    chart.add_series({
        'name': ['服务耗时统计', 0, 2],
        'categories':['服务耗时统计',1,0,row,0],
        'values':['服务耗时统计',1,2,row,2],
        'marker': {'type': 'circle',
                   'size':2},
    })
    chart.set_x_axis({
        'name':'时间刻度',
        'min':f_min,
        'max':f_max,


    })
    chart.set_y_axis({
        'name':'响应时间(ms)',
    })
    worksheet.insert_chart('F1',chart)
    workbook.close()
    print('done')
if __name__=='__main__':
    content=read_txt()
    min,max=min_max(content)
    writetoexcel(min,max)

 

最终效果图:

 

posted @ 2019-08-26 18:06  codeforu2  阅读(1026)  评论(0编辑  收藏  举报