1、Excel数据读取,数据的预处理(处理缺失等)
2、数据的排序等绘制图形前的处理
3、绘图的美好,包括字体大小,配色等
4、数据打印核对
具体代码如下:
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
import seaborn as sns
# 指定字体路径
font = FontProperties(fname='/Library/Fonts/SimHei.ttf')
# 读取Excel数据
df = pd.read_excel('/Users/runyabaobei/Desktop/11.xlsx', sheet_name=0)
# 将处理人列的缺失值替换为 "NA"
df['处理人'].fillna("NA", inplace=True)
# 将预估工时列的缺失值替换为 0
df['预估工时'].fillna(0, inplace=True)
# 按照“处理人”分组,然后对“预估工时”列进行求和
hours_data = df.groupby('处理人')['预估工时'].sum()
# 按照“处理人”列的值进行计数并由大到小排序
count_data = df['处理人'].value_counts().sort_values(ascending=False)
# 根据先前排序的 count_data 的索引处理人名称排序 hours_data
hours_data = hours_data.loc[count_data.index]
# 计算处理人的效率并按降序排序
efficiency_data = hours_data / count_data
efficiency_data.sort_values(ascending=False, inplace=True)
# 创建配色方案
color_count = sns.color_palette(["#609ec9"]) * len(count_data)
color_hours = sns.color_palette(["#f9b37e"]) * len(hours_data)
color_palette3 = sns.color_palette("viridis", len(efficiency_data))
sns.set(style="whitegrid")
# 创建第一张图
fig1, ax1 = plt.subplots(figsize=(12, 7))
# 在 ax1 上绘制计数和预估工时的柱状图
count_data.plot(kind='bar', ax=ax1, color=color_count, width=0.4, alpha=0.8,legend=False)
ax1_twin = ax1.twinx()
hours_data.plot(kind='bar', ax=ax1_twin, color=color_hours, width=0.3, alpha=0.8, position=0,legend=False)
# 设置 ax1 的标题和label
ax1.set_title('处理人计数与工时数柱状图', fontproperties=font, fontsize=18)
ax1.set_xlabel('处理人',fontproperties=font)
ax1.set_ylabel('计数',fontproperties=font)
ax1_twin.set_ylabel('工时数',fontproperties=font)
ax1.grid(False)
ax1.legend(['计数'], loc='upper left', prop=font)
ax1_twin.legend(['工时'], loc='upper right', prop=font)
ax1.set_xticklabels(ax1.get_xticklabels(), fontproperties=font, rotation=45, ha='right')
# 创建第二张图
fig2, ax2 = plt.subplots(figsize=(12, 7))
# 在 ax2 上绘制效率的柱状图
bars3 = efficiency_data.plot(kind='bar', ax=ax2, color=color_palette3, alpha=0.8)
# 设置 ax2 的标题和label
ax2.set_title('处理人效率柱状图', fontproperties=font, fontsize=20, pad=20)
ax2.set_xlabel('处理人', fontproperties=font)
ax2.set_ylabel('效率', fontproperties=font)
# 为ax2的xtick添加中文字体,并进行适当的旋转
ax2.set_xticklabels(ax2.get_xticklabels(), fontproperties=font, rotation=45, ha='right')
# 为每个柱状图添加数据标签展示
for bar in bars3.patches:
ax2.text(bar.get_x() + bar.get_width() / 2, bar.get_height() + 0.01,
round(bar.get_height(), 2), ha='center', va='bottom',
fontsize=8, color='black', alpha=0.8)
# 调整图表边缘和布局
plt.tight_layout()
print('\n每个处理人的计数:')
print(count_data)
print('\n每个处理人的预估工时(小时):')
print(hours_data)
print('\n每个处理人的效率(预估工时/处理人计数):')
print(efficiency_data)
图形绘制结果如下: