使用Python和Matplotlib绘制Excel多工作表数据报错及同图实现
问题描述
有一个包含多工作表的Excel文件,需求如下:
- 移除显示工作表名称的首行、显示单位的第三行
- 将其中5个工作表的数据以
D为X轴、S为Y轴绘制在同一图表中
尝试代码后出现KeyError: 'D',报错信息:
x = list(df['D']) ~~^^^^^^^^^^^^^^^ KeyError: 'D'
尝试的代码:
import openpyxl as xl import pandas as pd import matplotlib.pyplot as plt wb = xl.load_workbook('Mohsen.xlsx') fig, ax = plt.subplots() for sheets in wb.worksheets: df = pd.read_excel('Mohsen.xlsx', sheet_name=None, header=1, skiprows=lambda x: x in [2], names=["D", "S"]) x = list(df['D']) y = list(df["S"]) ax.lines(x, y) plt.show()
问题分析
- sheet_name参数错误:
sheet_name=None会返回一个字典(键为工作表名,值为对应DataFrame),而非单个DataFrame,直接用df['D']会因为字典中没有键'D'触发KeyError。 - skiprows逻辑错误:
header=1已指定原文件第2行(索引从0开始)为表头,要跳过原文件第三行(索引2),无需用lambda,直接传入skiprows=[2]即可;另外循环中重复读取整个Excel文件,效率极低。 - 绘图方法错误:
ax.lines不是绘图API,正确的折线图绘制方法是ax.plot()。
修正后的代码
假设需要绘制的5个工作表名为['Sheet1', 'Sheet2', 'Sheet3', 'Sheet4', 'Sheet5'](可根据实际修改),代码如下:
import pandas as pd import matplotlib.pyplot as plt # 指定要绘制的5个工作表名称 target_sheets = ['Sheet1', 'Sheet2', 'Sheet3', 'Sheet4', 'Sheet5'] # 统一读取参数:跳过第1行(索引0)、第3行(索引2),指定表头为D、S read_params = { 'header': None, # 不自动识别表头 'skiprows': [0, 2], # 跳过原文件第1行和第3行(索引0、2) 'names': ['D', 'S'], # 自定义列名 } fig, ax = plt.subplots(figsize=(10, 6)) for sheet_name in target_sheets: # 读取单个工作表的数据 df = pd.read_excel('Mohsen.xlsx', sheet_name=sheet_name, **read_params) # 绘制折线图,添加标签用于图例 ax.plot(df['D'], df['S'], label=sheet_name) # 添加图表元素 ax.set_xlabel('D') ax.set_ylabel('S') ax.set_title('Multi-Sheet Data Plot') ax.legend() plt.show()
代码说明
- 直接通过
target_sheets指定要绘制的5个工作表,避免读取不必要的表 skiprows=[0,2]直接跳过原文件的首行(工作表名)和第三行(单位),结合names自定义列名,确保D、S列能被正确识别- 每个工作表的绘图结果添加
label,最后通过legend()显示工作表名区分不同曲线 - 无需使用
openpyxl单独加载工作簿,pandas的read_excel已足够完成需求
内容的提问来源于stack exchange,提问作者Massoud Hassanabadi
相关产品推荐
相关产品推荐

