Python做一个绘图系统3:从文本文件导入数据并绘图

news2024/10/7 14:24:06

文章目录

    • 导入数据
    • 文件对话框
    • 修改绘图逻辑
    • 源代码

Python绘图系统系列:将matplotlib嵌入到tkinter 简单的绘图系统

导入数据

单纯从作图的角度来说,更多情况是已经有了一组数据,然后需要将其绘制。这组数据可能是txt格式的,也可能是csv格式的,还可能是二进制数据。当然,这些一会儿在想,首先就是要添加一个按钮,将setCtrlButtons函数添加一行:

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就是文件对话框,预感这个函数可能不止一处出现,故而导入一下,以方便调用

from tkinter.filedialog import askopenfilename

这个函数的好处是,只返回读取到的文件名,而不像askopenfile一样返回一个文件对象。

self.btnLoadData函数,如果只是想实现一个最简单的功能,那么
可以写为

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内容

def setEntry(e, text):
    e.delete(0, "end")
    e.insert(0, text)

接下来,将加载数据函数和绘图函数分别改写为

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,那么说明已经读取到了相关数据,就直接调用,而非重新生成。

在这里插入图片描述

源代码

最后,把源代码附在下面

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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/856814.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HashMap的put方法流程

首先根据key的值计算hash值&#xff0c;找到该元素在数组中存储的下标如果数组是空的&#xff0c;则调用resize进行初始化&#xff1b;如果没有哈希冲突直接放在对应的数组下标里如果冲突了&#xff0c;且key已经存在&#xff0c;就覆盖掉value如果冲突后是链表结构&#xff0c…

Android Studio实现刮刮卡效果

代码和刮刮乐图片参考网络 实现效果 MainActivity import android.app.Activity; import android.os.Bundle;public class MainActivity extends Activity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentVi…

汽车控制器底层软件BOOTLOADER开发经历

现在所谓智能汽车必备的OTA技术&#xff0c;在ECU控制器层面就是BOOT的开发&#xff0c;对应autosar体系里面的BSW基础软件。 同学刚开始接触汽车软件开发会有一种思想&#xff0c;要学就学听起来high level的autosar&#xff0c;但是到底autosar是个什么东西也搞不懂&#xf…

基于数据全生命周期的数据资产价值评估方法及应用

基于数据全生命周期的数据资产价值评估方法及应用 李冬青, 刘吟啸, 邓镭, 李铭洋 阿里巴巴集团&#xff0c;上海 200120 摘要&#xff1a;数据资产价值评估是现代数据资产管理和运营以及数据流通的基础。基于数据全生命周期理论&#xff0c;从第一性原则出发&#xff0c;通过评…

2023好用苹果电脑杀毒软件Cleanmymac X

苹果电脑怎么杀毒&#xff1f;这个问题自从苹果电脑变得越来越普及&#xff0c;苹果电脑的安全性问题也逐渐成为我们关注的焦点。虽然苹果电脑的安全性相对较高&#xff0c;但仍然存在着一些潜在的威胁&#xff0c;比如流氓软件窥探隐私和恶意软件等。那么&#xff0c;苹果电脑…

Day 25 C++ stack容器(栈)

文章目录 stack 基本概念定义基本概念栈顶&#xff08;Top&#xff09;——指向栈中最上面的元素的位置。入栈&#xff08;Push&#xff09;——将元素添加到栈顶。出栈&#xff08;Pop&#xff09;——从栈顶移除元素。栈空&#xff08;Empty&#xff09;——当栈中没有任何元…

企业权限管理(三)-产品添加

产品添加 从product-list.jsp跳转到product-add.jsp <button type"button" class"btn btn-default" title"新建" onclick"location.href${pageContext.request.contextPath}/pages/product-add.jsp"><iclass"fa fa-file…

后端开发9.商品类型模块

概述 简介 商品类型我设计的复杂了点,设计了多级类型 效果图 数据库设计

ORACLE和MYSQL区别

1&#xff0c;Oracle没有offet,limit&#xff0c;在mysql中我们用它们来控制显示的行数&#xff0c;最多的是分页了。oracle要分页的话&#xff0c;要换成rownum。 2&#xff0c;oracle建表时&#xff0c;没有auto_increment&#xff0c;所有要想让表的一个字段自增&#xff0c…

(JS逆向专栏十三)某信平台网站登入SM2

声明: 本文章中所有内容仅供学习交流&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 名称:电信 目标:登入参数 加密类型:SM2 目标网址:https://login.189.cn/web/login …

推出全新TrenchStop™ 5 WR6系列,IKWH50N65WR6XKSA1、IKWH40N65WR6XKSA1带来更佳的系统可靠性(IGBT)

推出全新分立式封装的650V TRENCHSTOP 5 WR6系列&#xff0c;该系列采用TO-247-3-HCC封装&#xff0c;能够实现额定电流分别为20A、30A、40A、50A、60A和70 A的丰富产品组合&#xff0c;可轻松替换前代技术&#xff0c;如TRENCHSTOP 5 WR5、HighSpeed 3 H3技术。该系列针对家用…

Linux驱动之设备树添加蜂鸣器驱动

目录 一、蜂鸣器简介 二、硬件原理分析 三、蜂鸣器驱动原理 四、开发环境 五、修改设备树文件 1、添加 pinctrl 节点 2、添加 BEEP 设备节点 3、检查 PIN 是否被其他外设使用 六、蜂鸣器驱动程序编写 七、测试程序编写 八、运行验证 在 I.MX6U-ALPHA 开发板上有一个有源…

【揽睿星舟】艺术二维码完全生成攻略

导航栏 一、云端平台 1-1、云端平台的优势&#xff1a; 1-2、选择适合的云端平台需要考虑以下几个方面&#xff1a; 二、账号注册界面如下&#xff1a; 三、生成方法 3-1、图像到图像 3-1-1、二维码生成 3-1-2、选择云端平台来启动Stable Diffusion的Web UI 3-1-3、使用S…

记录--使用 JS 实现基本的截图功能

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 思路分析 在开始动手之前&#xff0c;分析一下整个功能的实现过程&#xff1a; 根据图片大小创建 canvas1 画布&#xff0c;并将原图片直接定位在 canvas1 上&#xff1b; 在画布上添加一个蒙层&…

MySQL插入数据库 insert into 语句 用法总结

目录 步骤 一、建表&#xff1a; 二、插入第一行数据 二、插入第二行数据&#xff08;指定要插入字段&#xff09; 三、插入第三行数据&#xff08;指定要插入的字段&#xff0c;但不是所有字段&#xff0c;除了(stu_id, stu_gender)&#xff09; 四、使用一条insert in…

maven中常见问题

文章目录 一、配置项提示二、父子打包三、打包之后不显示target四、自定义打包之后的jar包名称五、整个项目打包5.1、父项目管理插件和微服务打包 一、配置项提示 SpringBoot中提示错误信息 表示的是SpringBoot中的注释提示没有配置&#xff01;那么可以来使用一下springboot官…

【VS Code插件开发】通用功能(二)

&#x1f431; 个人主页&#xff1a;不叫猫先生&#xff0c;公众号&#xff1a;前端舵手 &#x1f64b;‍♂️ 作者简介&#xff1a;2022年度博客之星前端领域TOP 2&#xff0c;前端领域优质作者、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步…

红帽8.2版本CSA题库:第六题创建协作目录权限

红帽认证工程师第六题创建协作目录权限 mkdir /home/managers chown :sysmgrs /home/managers chmod 2770 /home/managers 测试&#xff1a; touch /home/managers/12345 ll /home/managers/12345

【雕爷学编程】Arduino动手做(04)---震动传感器模块5

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

Windows和Linux系统上的矢量运算:指令级并行计算SIMD(SSE/VAX)

注&#xff1a;本文的SIMD&#xff0c;指的是CPU指令架构中的相关概念。不涉及GPU端的算力机制。 基本概念 SIMD&#xff0c;Single Instruction/Multiple Data&#xff0c; 即单指流令多数据流&#xff0c;例如一个乘法指令&#xff0c;可以并行的计算8个浮点数的乘法。 SIM…