一、需求
excel表格的数据示例如下图:
现在需要根据以上表格的数据,输出美化后的图片,方便运营同学查看
二、方案
数据本身就在excel中,可以使用excel数据透视图制作图表,然而自己的excel操作水平有限,实现起来比较困难
准备尝试使用python的plottable和matplotlib库来实现
matplotlib在前面的文章中已经使用过多次,这里不再说明,plottable的具体使用参考官网Styling a Table
三、实现
数据预处理
使用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)
运行效果: