请求帮助:在Excel工作表中嵌入数据透视表旁的图表
解决方案:在Excel工作表中插入图表至数据透视表旁
要实现将图表粘贴到数据透视表右侧的需求,你需要结合matplotlib生成图表,并通过openpyxl操作Excel工作表完成插入。以下是修改后的完整代码及关键说明:
依赖库导入
先确保安装所需依赖,再导入相关库:
import pandas as pd import matplotlib.pyplot as plt from openpyxl.drawing.image import Image from io import BytesIO
修改后的核心代码
# 初始化Excel写入器(mode='a'表示追加,若文件不存在可改为mode='w') with pd.ExcelWriter('OEE_OKL_WYNIK.xlsx', engine='openpyxl', mode='a') as writer: for nazwa in unikalne_nazwy: # 1. 筛选数据并生成数据透视表 wyfiltrowane_dane = df_wynik_podsumowanie[df_wynik_podsumowanie['NAZWA'] == nazwa] wyfiltrowane_dane = wyfiltrowane_dane.pivot_table( values='SREDNIA_NORMA_OSIAGNIETA_srednia', index='P1_v2', columns='P2_v2', aggfunc='max', fill_value=0 ) df_suma = pivot.add(wyfiltrowane_dane, fill_value=0) df_suma = df_suma[new_order_col].loc[new_order_row] # 2. 将数据透视表写入对应工作表 df_suma.to_excel(writer, sheet_name=nazwa) # 3. 获取当前工作表对象,准备插入图表 workbook = writer.book worksheet = workbook[nazwa] # 4. 生成图表(可根据需求调整类型) plt.figure(figsize=(10, 6)) # 示例:分组条形图,若需热力图可替换为seaborn的heatmap df_suma.plot(kind='bar', ax=plt.gca()) plt.title(f'{nazwa} - Średnia norma osiągnięta') plt.xlabel('P1_v2') plt.ylabel('Średnia wartość') plt.tight_layout() # 自动调整布局避免文字截断 # 5. 将图表保存到内存(无需写入本地文件) img_buffer = BytesIO() plt.savefig(img_buffer, format='png', dpi=100) img_buffer.seek(0) excel_img = Image(img_buffer) # 6. 设置图表位置(放在数据透视表右侧,示例从C1开始,可根据数据宽度调整) # 数据透视表的列数 = 索引列 + 数据列数,可根据实际情况修改anchor值 excel_img.anchor = 'C1' worksheet.add_image(excel_img) # 7. 关闭图表释放内存 plt.close()
关键说明
- 复用ExcelWriter:将写入器放在循环外,避免重复打开/关闭文件,同时能直接操作工作簿对象。
- 图表位置控制:通过
anchor参数指定图表插入的起始单元格(如C1表示第3列第1行),可根据数据透视表的实际宽度调整(例如数据到B列就用C列,到D列就用F列)。 - 图表类型调整:
- 若需要热力图,需先安装
seaborn,然后替换图表生成部分为:import seaborn as sns sns.heatmap(df_suma, annot=True, cmap='YlGnBu', ax=plt.gca()) - 也可根据需求选择
line、area等其他图表类型。
- 若需要热力图,需先安装
- 内存优化:用
BytesIO将图表保存在内存中,避免生成临时文件,提升效率。
内容的提问来源于stack exchange,提问作者Kamil
相关产品推荐
相关产品推荐

