0
点赞
收藏
分享

微信扫一扫

Python实现excel数据到美观图片的转换

一、需求

excel表格的数据示例如下图:

Python实现excel数据到美观图片的转换_图片

现在需要根据以上表格的数据,输出美化后的图片,方便运营同学查看

二、方案

数据本身就在excel中,可以使用excel数据透视图制作图表,然而自己的excel操作水平有限,实现起来比较困难

准备尝试使用python的plottable和matplotlib库来实现

matplotlib在前面的文章中已经使用过多次,这里不再说明,plottable的具体使用参考官网Styling a Table

Python实现excel数据到美观图片的转换_excel_02

三、实现

数据预处理

使用pandas读取表格数据,获取分组、表头列名等,处理百分比数据

import pandas as pd


def beauty_excel(file):
    # excel表格读取和数据前置处理
    groups = pd.read_excel(file).columns  # 读取excel,获取分组名称
    df = pd.read_excel(file, header=1)  # 读取excel,第二行作为表头
    df.index = df.index + 1  # 设置index索引列起始值从1开始
    df['成功率(%)'] = df['成功率(%)'] / 100  # 将”成功率(%)“转换为小数,便于后续绘图使用
    df['成功率(%).1'] = df['成功率(%).1'] / 100  # “成功率(%)”列名重复,pandas读取时自动在重复的列名后面添加“.1”
    df['GAP(%)'] = df['GAP(%)'] / 100  # 将“GAP(%)“转换为小数
    columns = df.columns  # 表头列名

绘制表格图

plottable分别设置每一列的数据的格式和展示样式,matplotlib展示和保存图像

注意:数据包含中文,需要通过mpl.rcParams['font.sans-serif']=['STSong']设置中文字体,否则图片会包含乱码

import matplotlib.pyplot as mpl
from plottable import Table, ColumnDefinition
from plottable.plots import bar, progress_donut
from matplotlib.colors import LinearSegmentedColormap


def beauty_excel(file):
    # excel表格读取和数据前置处理
	#--代码--
    #--代码--
    
    # 绘制表格图
    fig, ax = mpl.subplots(figsize=(9, 9))  # 图像大小
    mpl.rcParams['font.sans-serif'] = ['STSong']  # 设置字体为宋体--设置后可正常显示中文
    color_map = LinearSegmentedColormap.from_list(name="color_map",
                                                  colors=["#ffffff", "#f2fbd2", "#c9ecb4", "#93d3ab", "#35b0ab"],
                                                  N=256)  # 创建颜色map
    table = Table(df, ax=ax,
                  odd_row_color='#bbffff',  # 偶数列的表格背景颜色
                  even_row_color='white',  # 奇数列表格背景颜色
                  footer_divider=True,  # 表格边界线--显示
                  textprops={'ha': 'center'},  # 居中对齐
                  column_definitions=[
                      # ColumnDefinition(name='index', title="", width=0, textprops={"ha": "right", 'color': 'w'}),
                      ColumnDefinition(name='index', title="序号", textprops={"ha": "center"}),  # 序号列
                      ColumnDefinition(name=columns[0], textprops={"ha": "center"}),  # 姓名列,居中
                      ColumnDefinition(name=columns[1], group=groups[1]),  # 1月任务完成数量
                      ColumnDefinition(name=columns[2], group=groups[1],  # 1月成功率
                                       plot_fn=progress_donut,  # 圆环图
                                       plot_kw={"is_pct": True,  # 百分比数据
                                                "formatter": "{:.2f}",  # 保留两位小数
                                                'radius': 0.5,  # 圆环半径
                                                'textprops': {'fontsize': 8}}),  # 字体大小
                      ColumnDefinition(name=columns[3], title=columns[3].split(".")[0], group=groups[3]),  # 2月任务完成数量
                      ColumnDefinition(name=columns[4], title=columns[4].split(".")[0],  # 2月成功率
                                       group=groups[3],
                                       plot_fn=bar,  # 柱状图
                                       plot_kw={"cmap": color_map,  # 根据数据的值,显示颜色map。
                                                "plot_bg_bar": True,
                                                "annotate": True,
                                                "height": 0.8,
                                                "lw": 0.5,
                                                "formatter": "{:.1%}"}),
                      ColumnDefinition(name=columns[5], formatter="{:.1%}",
                                       textprops={'color': 'green', 'weight': 'bold'})  # GAP列,绿色加粗
                  ]
                  )
    mpl.show()  # 显示图片
    fig.savefig('beauty_excel.png', dpi=600, bbox_inches='tight')  # 保存图片,去掉空白区域


if __name__ == "__main__":
    file_path = 'task_info.xlsx'
    beauty_excel(file_path)

运行效果:

Python实现excel数据到美观图片的转换_excel_03

举报

相关推荐

0 条评论