一、需求背景

通常,我们将测试问题记录在Excel文件中,以便同学们能够轻松地查看问题汇总。如果将Excel中的数据转换为图表形式,将能够更加直观地呈现我们所关注的问题,以便更好地理解和分析测试问题。

源数据excel示例:

Python matplotlib将excel数据转换为图表【饼图】_matplotlib

根据上图的数据示例,这里将绘制:

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}")

运行结果:

Python matplotlib将excel数据转换为图表【饼图】_excel_02

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, '模块', '模块分布图')

运行结果:

Python matplotlib将excel数据转换为图表【饼图】_图表_03

问题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, '模块', '模块分布图')

运行结果:

Python matplotlib将excel数据转换为图表【饼图】_matplotlib_04