Python编写绘图系统之从文本文件导入数据并绘图
Python绘图系统系列:将matplotlib嵌入到tkinter 简单的绘图系统
导入数据
单纯从作图的角度来说,更多情况是已经有了一组数据,然后需要将其绘制。这组数据可能是txt格式的,也可能是csv格式的,还可能是二进制数据。当然,这些一会儿在想,首先就是要添加一个按钮,将 setCtrlButtons
函数添加一行:
1 2 3 4 5 | def setCtrlButtons( self , frm): ttk.Button(frm, text = "绘图" ,width = 5 , command = self .btnDrawImg).pack(side = tk.LEFT) ttk.Button(frm, text = "加载" ,width = 5 , command = self .btnLoadData).pack(side = tk.LEFT) |
然后就可以考虑 self.btnLoadData
函数了。
简洁起见,以后将不再具体展示 setCtrlButtons
的具体代码,而只是写出新增的代码。
文件对话框
加载数据,其实就是加载文件,那么文件对话框就很重要。
tkinter.filedialog
中的 askopenfilename
就是文件对话框,预感这个函数可能不止一处出现,故而导入一下,以方便调用
这个函数的好处是,只返回读取到的文件名,而不像 askopenfile
一样返回一个文件对象。
而 self.btnLoadData
函数,如果只是想实现一个最简单的功能,那么可以写为
1 2 3 4 5 6 7 8 | def btnLoadData( self ): name = askopenfilename() data = np.genfromtxt(name) if data.shape[ 1 ] < 2 : return self .xs = data[:, 0 ] self .ys = data[:, 1 ] self .drawPlot() |
效果如下
修改绘图逻辑
现在,我们有了两种数据生成模式,一是用语法生成,二是通过加载得到。但目前来说这两种生成方式并不兼容。为了解决这个问题,可以为x和y的输入框添加一个标识,比如当x或者y的输入框中是data的时候,再点击绘图,就可以选中加载后的数据。
由于tkinter中输入Entry内容比较繁琐,所以封装一个全局的函数专门用于更改Entry内容
接下来,将加载数据函数和绘图函数分别改写为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | def btnLoadData( self ): name = askopenfilename() data = np.genfromtxt(name) if data.shape[ 1 ] < 2 : return self .xs = data[:, 0 ] setEntry( self .xEntry, "data" ) self .ys = data[:, 1 ] setEntry( self .yEntry, "data" ) def btnDrawImg( self ): xLab = self .xEntry.get() if xLab ! = "data" : x = eval (f "np.linspace({xLab})" ) self .xs = x else : x = self .xs yLab = self .yEntry.get() if yLab ! = "data" : self .ys = eval (yLab) self .drawPlot() |
在btnLoadData函数中,取消了绘图功能,而是在导入数据后,将xEntry和yEntry的内容设置为"data"。
而绘图函数中,检测xEntry和yEntry的内容,如果是data,那么说明已经读取到了相关数据,就直接调用,而非重新生成。
源代码
最后,把源代码附在下面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | import tkinter as tk import tkinter.ttk as ttk from tkinter.filedialog import askopenfilename import matplotlib as mpl mpl.use( 'TkAgg' ) import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import ( FigureCanvasTkAgg, NavigationToolbar2Tk) from matplotlib.figure import Figure import numpy as np def setEntry(e, text): e.delete( 0 , "end" ) e.insert( 0 , text) class DarwSystem(): def __init__( self ): self .root = tk.Tk() self .root.title( "数据展示工具" ) frmCtrl = ttk.Frame( self .root,width = 320 ) frmCtrl.pack(side = tk.RIGHT, fill = tk.Y) self .setFrmCtrl(frmCtrl) frmFig = ttk.Frame( self .root) frmFig.pack(side = tk.LEFT,fill = tk.BOTH,expand = tk.YES) self .setFrmFig(frmFig) self .root.mainloop() def setFrmCtrl( self , frmCtrl): frm = ttk.Frame(frmCtrl, width = 320 ) frm.pack(side = tk.TOP, fill = tk.X) self .setCtrlButtons(frm) frm = ttk.Frame(frmCtrl) frm.pack(side = tk.TOP, fill = tk.X) self .setFrmX(frm) frm = ttk.Frame(frmCtrl) frm.pack(side = tk.TOP, fill = tk.X) self .setFrmY(frm) def setFrmX( self , frm): tk.Label(frm, text = "x" ).pack(side = tk.LEFT) self .xEntry = tk.Entry(frm) self .xEntry.pack(side = tk.LEFT, fill = tk.X) def setFrmY( self , frm): tk.Label(frm, text = "y" ).pack(side = tk.LEFT) self .yEntry = tk.Entry(frm) self .yEntry.pack(side = tk.LEFT, fill = tk.X) def setCtrlButtons( self , frm): ttk.Button(frm, text = "绘图" ,width = 5 , command = self .btnDrawImg).pack(side = tk.LEFT) ttk.Button(frm, text = "加载" ,width = 5 , command = self .btnLoadData).pack(side = tk.LEFT) def btnLoadData( self ): name = askopenfilename() data = np.genfromtxt(name) if data.shape[ 1 ] < 2 : return self .xs = data[:, 0 ] setEntry( self .xEntry, "data" ) self .ys = data[:, 1 ] setEntry( self .yEntry, "data" ) def btnDrawImg( self ): xLab = self .xEntry.get() if xLab ! = "data" : x = eval (f "np.linspace({xLab})" ) self .xs = x else : x = self .xs yLab = self .yEntry.get() if yLab ! = "data" : self .ys = eval (yLab) self .drawPlot() def drawPlot( self ): self .fig.clf() ax = self .fig.add_subplot() ax.plot( self .xs, self .ys) self .fig.subplots_adjust(left = 0.1 , right = 0.95 , top = 0.95 , bottom = 0.08 ) self .canvas.draw() pass def setFrmFig( self , frmFig): self .fig = Figure() self .canvas = FigureCanvasTkAgg( self .fig,frmFig) self .canvas.get_tk_widget().pack( side = tk.TOP,fill = tk.BOTH,expand = tk.YES) self .toolbar = NavigationToolbar2Tk( self .canvas,frmFig, pack_toolbar = False ) self .toolbar.update() self .toolbar.pack(side = tk.RIGHT) if __name__ = = "__main__" : test = DarwSystem() |
到此这篇关于Python编写绘图系统之从文本文件导入数据并绘图的文章就介绍到这了,更多相关Python绘图系统内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
微信公众号搜索 “ 脚本之家 ” ,选择关注
程序猿的那些事、送书等活动等着你
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!
相关文章
python 实现的发送邮件模板【普通邮件、带附件、带图片邮件】
这篇文章主要介绍了python 实现的发送邮件模板,包含Python发送普通邮件、带附件及带图片邮件相关实现技巧,需要的朋友可以参考下2019-07-07Django 全局的static和templates的使用详解
这篇文章主要介绍了Django 全局的static和templates的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2019-07-07
最新评论