Python使用Matplotlib绘制Excel数据完整流程

Theo
Theo
发布时间:2026-10-16| 3人浏览过
原创

本文介绍如何使用Python的Matplotlib库读取Excel文件中的数据并绘制图表。文章详细讲解了数据初始化、参数配置(如坐标起始列行、图例名称)、绘图逻辑以及图片尺寸与DPI设置,确保输出的图片符合高清规范且不失真。

前言

时隔许久再次更新,今天分享一个简短的技术博文。主要任务是读取Excel文件中的数据,并利用Matplotlib库将其绘制为图表。

原始数据格式如下:

Excel文件中包含多个工作表(Sheet),每个工作表中对应着点的坐标数据。最终期望达到的效果如图所示:

同时,我们需要满足特定的图片输出规范:

只有符合上述规范,生成的图片才不会失真。当然,如果没有上级催促,这篇内容可能不会这么早面世(笑)。

实现过程

接下来展示具体的实现代码,主要包含两个部分:读取Excel数据以及使用Matplotlib绘制图片。

数据读取部分

首先进行数据读取,这部分逻辑相对简单,主要在类的初始化阶段完成。

    def __init__(self,file_path,pic_name=None,
                 legend_names=None,padx=0,pady=1,
                 save_path_pre="./pic"
                 ):
        """
        默认存储的图片为4K,600dpi
        :param file_path:
        :param pic_name:
        :param legend_names:
        :param padx:
        :param pady:
        :param save_path_pre:
        """
        self.xl_file = xlrd.open_workbook(file_path)
        self.sheet_names = self.xl_file.sheet_names()
        self.legend_names = None
        self.setTrans = False
        self.setFig = False
        self.join = False
        self.padx = padx
        self.pady = pady
        self.save_path_pre = save_path_pre
        if(pic_name):
            self.pic_name = pic_name
        else:
            self.pic_name = self.sheet_names
        if(legend_names and padx==None):
            self.legend_names=legend_names
        elif(legend_names==None):
            sheet1 = self.xl_file.sheets()[0]
            sheet1_cols = sheet1.col_values(padx)
            self.legend_names = sheet1_cols[pady:]
        elif(legend_names!=None):
            self.legend_names = legend_names
        else:
            raise Exception("请检查格式,或者参数设置")

这里对初始化函数中的几个关键参数进行解释:

默认存储的图片分辨率为4K,DPI设置为600。 :param file_path: Excel文件路径 :param pic_name: 图片名称 :param legend_names: 图例名称列表 :param padx: 数据起始列索引 :param pady: 数据起始行索引 :param save_path_pre: 图片保存路径前缀

例如在前面的例子中,数据从第1行第1列开始,索引从0开始计算。

如果未指定图例说明(legend_names),代码将自动提取pady对应列的数据作为图例名称。

绘图部分

绘图过程非常直接,只需调用plt相关函数并传入已读取的数据即可。

    def creatPic(self,legend_loc='upper right',multiple=40,
                 padding=10000,width=4096,height=3112
                 ):
        """
        :param legend_loc: 图例的说明
        :return:
        """
        if(self.setFig and self.setFig):
            for sheet_index in range(len(self.xl_file.sheet_names())):
                sheet = self.xl_file.sheets()[sheet_index]
                self.plt = self.creatFigure()
                #按照行进行读取
                for row in range(self.pady,len(self.legend_names)+self.pady):
                    row_data_y = [self.transform(float(data),padding) for data in sheet.row_values(row)[self.padx+1:]]
                    row_data_x = [x*multiple for x in range(len(row_data_y))]
                    label_name = self.legend_names[row-self.pady]
                    self.plt.plot(row_data_x,row_data_y,label=label_name)
                plt.legend()
                save_path = self.save_path_pre+"./"+self.pic_name[sheet_index]+".jpg"
                self.plt.savefig(save_path,
                                 dpi=600, bbox_inches='tight'
                                 )
                self.changeImgSiz(save_path)
                self.plt.pause(0.05)
        else:
            raise Exception("请先设置数据转换方式以及绘图")

此外,代码中还包含调整图片尺寸的逻辑,因为画布尺寸与实际保存的图片尺寸可能存在差异。这部分可根据需要调整。如果直接保存为PNG格式,可能会导致X轴和Y轴的标签显示不全。若重新调整尺寸,DPI可能会变为96,具体效果需自行权衡。

完整代码实现

import matplotlib.pyplot as plt  # 为方便简介为plt
import xlrd
import math
from PIL import Image
class Draw(object):
    def __init__(self,file_path,pic_name=None,
                 legend_names=None,padx=0,pady=1,
                 save_path_pre="./pic"
                 ):
        """
        默认存储的图片为4K,600dpi
        :param file_path:
        :param pic_name:
        :param legend_names:
        :param padx:
        :param pady:
        :param save_path_pre:
        """
        self.xl_file = xlrd.open_workbook(file_path)
        self.sheet_names = self.xl_file.sheet_names()
        self.legend_names = None
        self.setTrans = False
        self.setFig = False
        self.join = False
        self.padx = padx
        self.pady = pady
        self.save_path_pre = save_path_pre
        if(pic_name):
            self.pic_name = pic_name
        else:
            self.pic_name = self.sheet_names
        if(legend_names and padx==None):
            self.legend_names=legend_names
        elif(legend_names==None):
            sheet1 = self.xl_file.sheets()[0]
            sheet1_cols = sheet1.col_values(padx)
            self.legend_names = sheet1_cols[pady:]
        elif(legend_names!=None):
            self.legend_names = legend_names
        else:
            raise Exception("请检查格式,或者参数设置")
    def setTransform(self,joinPoint=None):
        if(joinPoint):
            self.transform = joinPoint
            self.join = True
        else:
            self.transform_core = math.log
        self.setTrans = True
    def transform(self,x,pading=10000):
        if(self.join):
            return self.transform_core(x)
        else:
            return self.transform_core(x+pading)
    def setFigure(self,style='seaborn-whitegrid',fig=None,
                  xlabel='x',ylabel='log(y)'):
        self.fig = fig
        self.style = style
        self.xlabel = xlabel
        self.ylabel = ylabel
        self.setFig = True
    def changeImgSiz(self,path,width=4096,height=4096):
        img_switch = Image.open(path)
        img_deal = img_switch.resize((width,height), Image.ANTIALIAS)
        img_deal.save(path)
    def creatFigure(self):
        self.plt = plt
        if(self.fig):
            self.plt = self.fig()
        else:
            self.plt.rcParams['font.sans-serif'] = ['SimHei']
            self.plt.rcParams['axes.unicode_minus'] = False
            self.plt.figure(figsize=(8, 8))
            self.plt.style.use(self.style)
            self.plt.xlabel(self.xlabel)
            self.plt.ylabel(self.ylabel)
        return self.plt
    def creatPic(self,legend_loc='upper right',multiple=40,
                 padding=10000,width=4096,height=3112
                 ):
        """
        :param legend_loc: 图例的说明
        :return:
        """
        if(self.setFig and self.setFig):
            for sheet_index in range(len(self.xl_file.sheet_names())):
                sheet = self.xl_file.sheets()[sheet_index]
                self.plt = self.creatFigure()
                #按照行进行读取
                for row in range(self.pady,len(self.legend_names)+self.pady):
                    row_data_y = [self.transform(float(data),padding) for data in sheet.row_values(row)[self.padx+1:]]
                    row_data_x = [x*multiple for x in range(len(row_data_y))]
                    label_name = self.legend_names[row-self.pady]
                    self.plt.plot(row_data_x,row_data_y,label=label_name)
                plt.legend()
                save_path = self.save_path_pre+"./"+self.pic_name[sheet_index]+".jpg"
                self.plt.savefig(save_path,
                                 dpi=600, bbox_inches='tight'
                                 )
                self.changeImgSiz(save_path)
                self.plt.pause(0.05)
        else:
            raise Exception("请先设置数据转换方式以及绘图")
if __name__ == '__main__':
    file_path = ''
    save_path_pre = ''
    legend_names = ['','','']
    draw = Draw(file_path,legend_names=legend_names,save_path_pre=save_path_pre)
    draw.setTransform()
    draw.setFigure()
    draw.creatPic()
    

至此,关于Python使用Matplotlib绘制Excel数据Demo的实现流程介绍完毕。如需了解更多Python绘图相关内容,欢迎查阅本站往期文章或继续浏览后续教程,感谢大家的支持!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。