一、需求背景
通常,我们将测试问题记录在Excel文件中,以便同学们能够轻松地查看问题汇总。如果将Excel中的数据转换为图表形式,将能够更加直观地呈现我们所关注的问题,以便更好地理解和分析测试问题。
源数据excel示例:
根据上图的数据示例,这里将绘制:
1.模块分布--饼图
2.优先级分布--柱状图
3.状态分布--柱状图
二、步骤解析
饼图
1 预处理数据
使用pandas库读取excel并进行筛选处理
import pandas
path = "xxx问题记录.xlsx"
df = pandas.read_excel(path) # pandas读取excel
data = df['模块'] # 提取模块列的数据
x_data = (data.drop_duplicates().dropna()).values # 去重并去掉空值
y_data = data.value_counts(sort=False).values # 筛选计数,不排序
print(f"x_data:{x_data}")
print(f"y_data:{y_data}")
运行结果:
2 绘制图表
需要先安装导入matplotlib
import os
import pandas
from matplotlib import pyplot as mpl
def create_pie(path, col, title):
"""
绘制饼图
:param path: 文件路径
:param col: excel文件中的指定列名
:param title: 饼图标题
:return:
"""
# 预处理数据
file_name = os.path.basename(path).split('.xlsx')[0] # 截取data_path的文件名
df = pandas.read_excel(path) # pandas读取excel
data = df[col] # 提取指定列的数据
x_data = (data.drop_duplicates().dropna()).values # 去重并去掉空值
y_data = data.value_counts(sort=False).values # 筛选计数,不排序
# 绘制图表
mpl.pie(y_data, labels=x_data) # 饼图
mpl.title(f"【{file_name}】{title}", fontsize=16) # 设置标题名称和字体大小
mpl.show() # 显示图像
if __name__ == "__main__":
file_path = "xxx问题记录.xlsx"
create_pie(file_path, '模块', '模块分布图')
运行结果:
问题1--图表里的中文展示异常:
设置图表rcParams参数的字体可以解决中文展示问题,这里设置字体为宋体
mpl.rcParams['font.sans-serif'] = ['STSong']
问题2--图表中缺少百分比的标签:
设置饼图对象pie的autopct参数,下面是添加百分比标签和数量的代码片段
mpl.pie(y_data, labels=x_data, autopct=lambda pct: pct_fun(pct, y_data))
def pct_fun(pct, num):
"""饼图百分比格式化"""
n = round(pct * sum(num) / 100) # 数量
return f'{pct:.1f}%\n{n}'
问题3--自定义图表的样式:
安装导入matplotx库来自定义设置图表的样式
import matplotx
mpl.style.use(matplotx.styles.tokyo_night['storm'])
3 饼图完整代码
import os
import matplotx
import pandas
from matplotlib import pyplot as mpl
def create_pie(path, col, title):
"""
绘制饼图
:param path: 文件路径
:param col: excel文件中的指定列名
:param title: 饼图标题
:return:
"""
# 预处理数据
file_name = os.path.basename(path).split('.xlsx')[0] # 截取data_path的文件名
df = pandas.read_excel(path) # pandas读取excel
data = df[col] # 提取指定列的数据
x_data = (data.drop_duplicates().dropna()).values # 去重并去掉空值
y_data = data.value_counts(sort=False).values # 筛选计数,不排序
# 绘制图表
mpl.style.use(matplotx.styles.tokyo_night['storm']) # 自定义图表样式
mpl.rcParams['font.sans-serif'] = ['STSong'] # 设置字体为宋体--设置后可正常显示中文
figure = mpl.figure() # 创建图像
mpl.pie(y_data, labels=x_data, autopct=lambda pct: pct_fun(pct, y_data)) # 饼图--添加百分比标签和数量
mpl.title(f"【{file_name}】{title}", fontsize=16) # 设置标题名称和字体大小
mpl.show() # 显示图像
def pct_fun(pct, num):
"""饼图百分比格式化"""
n = round(pct * sum(num) / 100) # 数量
return f'{pct:.1f}%\n{n}'
if __name__ == "__main__":
file_path = "xxx问题记录.xlsx"
create_pie(file_path, '模块', '模块分布图')
运行结果: