python绘图小dome
创始人
2024-04-04 10:42:51
0

文章目录

  • 前言
  • 实现
    • 读取数据
    • 绘图
    • 完整实现
  • 总结

前言

冒个泡泡,好久没有冒泡泡了,那么今天的话就浅浅水一下博文吧。任务是这样的,将Excel当中的数据,把它放到咱们的matlpolitlib里面去画个图。
数据是这样子的:
在这里插入图片描述
这里面有很多sheet,然后还有对应的点的坐标。要最终实现的效果就是:
在这里插入图片描述
并且我们还需要符合规范:
在这里插入图片描述
这样的话图片才不会失真。BOSS不催,小爷不写(狗头)

实现

那么这里的话就是咱们的实现了这个Excel的读取,然后是绘制图片。

读取数据

首先是读取数据,这部分相当简单,就在初始化做了。

    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 = Noneself.setTrans = Falseself.setFig = Falseself.join = Falseself.padx = padxself.pady = padyself.save_path_pre = save_path_preif(pic_name):self.pic_name = pic_nameelse:self.pic_name = self.sheet_namesif(legend_names and padx==None):self.legend_names=legend_nameselif(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_nameselse:raise Exception("请检查格式,或者参数设置")

这里我解释一下这几个参数的含义

    默认存储的图片为4K,600dpi:param file_path::param pic_name::param legend_names: 图例的名字:param padx: 数据是从哪一个列开始的:param pady: 哪一个行开始的:param save_path_pre:"""

例如刚刚的例子,是在第1行第1列开始的,下标0开始。
如果没有指定那个图例说明的话,那么代码就会直接取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轴的说明可能没有了。那么重新resize的话,dpi会变成96,所以看自己吧

完整实现

import matplotlib.pyplot as plt  # 为方便简介为plt
import xlrd
import math
from PIL import Imageclass 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 = Noneself.setTrans = Falseself.setFig = Falseself.join = Falseself.padx = padxself.pady = padyself.save_path_pre = save_path_preif(pic_name):self.pic_name = pic_nameelse:self.pic_name = self.sheet_namesif(legend_names and padx==None):self.legend_names=legend_nameselif(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_nameselse:raise Exception("请检查格式,或者参数设置")def setTransform(self,joinPoint=None):if(joinPoint):self.transform = joinPointself.join = Trueelse:self.transform_core = math.logself.setTrans = Truedef 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 = figself.style = styleself.xlabel = xlabelself.ylabel = ylabelself.setFig = Truedef 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 = pltif(self.fig):self.plt = self.fig()else:self.plt.rcParams['font.sans-serif'] = ['SimHei']self.plt.rcParams['axes.unicode_minus'] = Falseself.plt.figure(figsize=(8, 8))self.plt.style.use(self.style)self.plt.xlabel(self.xlabel)self.plt.ylabel(self.ylabel)return self.pltdef 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()

总结

ok,水完了,快结束了

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...