tkinter打造三维绘图系统,附源代码

文章目录

    • 输入数据
    • 加载数据
    • 绘图函数
    • 源代码

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

输入数据

三维绘图需要一个新的坐标变量,设置为z,这个改改UI就可以办到,并不困难。但是,此前用于设置x和y数据的函数实在是过于雷同,如果再写一个设置z轴的,那么这个绘图系统里就相当于是有了3个一毛一样的函数,十分离谱,所以为了简化代码,可以将所有的数据输入框设为一个字典,然后挨个生成xyz的输入框,其中setFrmCtrl函数如下

def setFrmCtrl(self, frmCtrl):frm = ttk.Frame(frmCtrl, width=320)frm.pack(side=tk.TOP, fill=tk.X)self.setCtrlButtons(frm)self.entrys = {}for flag in 'xyz':frm = ttk.Frame(frmCtrl)frm.pack(side=tk.TOP, fill=tk.X)self.setFrmAxis(frm, flag)

setFrmAxis则没什么好说的,只是新增了一个参数而已。

def setFrmAxis(self, frm, flag):tk.Label(frm, text=flag).pack(side=tk.LEFT)self.entrys[flag] = tk.Entry(frm)self.entrys[flag].pack(side=tk.LEFT, fill=tk.X)    

加载数据

此前,分别用self.xsself.ys来表示x和y轴数据,这又是一个雷同。为了简化代码,将变量也设做字典,在初始化的init函数中添加

self.data = {}

然后将加载数据的函数改写为

def btnLoadData(self):name = askopenfilename()data = np.genfromtxt(name)for flag, i in enumerate()'xyz':if i >= data.shape[1]:returnself.data[flag] = data[:,i]setEntry(self.entrys[flag], 'data')

然后新建一个用来读取Entry的函数,考虑到x和y都有可能用类似1,1,5的形式生成,所以先做一个检测数组的全局函数

def detectArray(s):return s.rstrip('0123456789:, ')==''

然后是readEntrys函数,考虑到在函数表达式中,用x和y指代self.data[‘x’]和selfdata[‘y’],所以需要新建局部变量x和y,以确保eval函数的正常使用。

def readEntrys(self):for flag in 'xyz':label = self.entrys[flag].get()if label != 'data':if detectArray(label):label = f"np.linspace({label})"self.data[flag] = eval(self.entrys[flag].get())if flag =='x' : x = self.data['x']elif flag =='y' : y = self.data['y']        if self.entrys['z'].get()=="":del self.data['z']

绘图函数

最后,就是绘图功能的实现,由于有了readEntrys函数,从而btnDrawImg函数变得更加专注,只需复制调用专门的绘图函数就可以了。三维绘图函数和二维绘图函数其实没什么区别,只要绘制的还是plot图,区别只是多加了一个z轴坐标而已。

def btnDrawImg(self):self.readEntrys()self.fig.clf()if 'z' in self.data: self.drawPlot3D()else:self.drawPlot()self.fig.subplots_adjust(left=0.1, right=0.95, top=0.95, bottom=0.08)self.canvas.draw()

由于把用于设置边框宽度的subplots_adjust以及canvas.draw放在了btnDrawImg这个函数中,所以drawPlot函数也需要做适当的精简。而drawPlot3D只是将projection设为‘3d’,同时添加一组z坐标而已。

def drawPlot(self):ax = self.fig.add_subplot()ax.plot(self.data['x'], self.data['y'])def drawPlot3D(self):ax = self.fig.add_subplot(projection='3d')ax.plot(self.data['x'], self.data['y'], self.data['z'])

至此,就可以看一下效果了

在这里插入图片描述

源代码

最后,附上源代码

import tkinter as tk
import tkinter.ttk as ttk
from tkinter.filedialog import askopenfilenameimport matplotlib as mpl
mpl.use('TkAgg')
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk)
from matplotlib.figure import Figureimport numpy as npdef setEntry(e, text):e.delete(0, "end")e.insert(0, text)def detectArray(s):return s.rstrip('0123456789:, ')==''class DarwSystem():def __init__(self):self.root = tk.Tk()self.root.title("数据展示工具")self.data = {}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)self.entrys = {}for flag in 'xyz':frm = ttk.Frame(frmCtrl)frm.pack(side=tk.TOP, fill=tk.X)self.setFrmAxis(frm, flag)def setFrmAxis(self, frm, flag):tk.Label(frm, text=flag).pack(side=tk.LEFT)self.entrys[flag] = tk.Entry(frm)self.entrys[flag].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)for i, flag in enumerate('xyz'):if i >= data.shape[1]:returnself.data[flag] = data[:,i]setEntry(self.entrys[flag], 'data')def readEntrys(self):for flag in 'xyz':label = self.entrys[flag].get()if label=="":continueif label != 'data':if detectArray(label):label = f"np.linspace({label})"self.data[flag] = eval(self.entrys[flag].get())if flag =='x' : x = self.data['x']elif flag =='y' : y = self.data['y']        if self.entrys['z'].get()=="":del self.data['z']def btnDrawImg(self):self.readEntrys()self.fig.clf()if 'z' in self.data:self.drawPlot3D()else:self.drawPlot()self.fig.subplots_adjust(left=0.1, right=0.95, top=0.95, bottom=0.08)self.canvas.draw()def drawPlot3D(self):ax = self.fig.add_subplot(projection='3d')ax.plot(self.data['x'], self.data['y'], self.data['z'])def drawPlot(self):ax = self.fig.add_subplot()ax.plot(self.data['x'], self.data['y'])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.hqwc.cn/news/65895.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【EI复现】考虑区域多能源系统集群协同优化的联合需求侧响应模型(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

yo!这里是STL::list类简单模拟实现

目录 前言 重要接口实现 框架 默认成员函数 迭代器(重点) 1.引言 2.list迭代器类实现 3.list类中调用实现 增删查改 后记 前言 我们知道,stl中的vector对应数据结构中的顺序表,string类对应字符串,而今天要…

时序预测 | MATLAB实现CNN-BiGRU-Attention时间序列预测

时序预测 | MATLAB实现CNN-BiGRU-Attention时间序列预测 目录 时序预测 | MATLAB实现CNN-BiGRU-Attention时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现CNN-BiGRU-Attention时间序列预测,CNN-BiGRU-Attention结合注意力机制时…

Streamlit项目: 轻松搭建部署个人博客网站

文章目录 1 前言1.1 探索 Streamlit:轻松创建交互式应用1.2 最全 Streamlit 教程专栏 2 我的个人博客网站已上线!2.1 一个集成了智能中医舌诊-中e诊专栏的博客网站2.2 前期准备2.3 使用 Streamlit Cloud 运行 3 知识点讲解3.1 实现多页面:两种…

KMP算法比较次数

主串T “abaabaabcabaabc”,模式串S“abaabc”,采用KMP算法匹配,到匹配成功为止,比较次数是: 序号: 1 2 3 4 5 6 模式串:a b a a b c next[j]: 0 1 1 2 2 3 关于next数组求法&#…

Tomcat的多实例和动静分离

目录 一、多实例 二、 nginxtomcat的负载均衡和动静分离 三、Tomcat 客户端->四层代理->七层代理->tomcat服务器 实验: 问题总结: tomcat日志文件:/usr/local/tomcat/logs/catalina.out 一、多实例 在一台服务器上有多个tomc…

如何在电力行业运用IPD?

电力行业是国民经济众多垄断行业中较早实施改革的行业之一。近几年我国电力行业保持着较快的发展速度,也取得了很大的成绩,发电机容量和发电量居世界首位。2015-2020年,全国发电量不断攀升。 电力是以电能作为动力的能源。电力的发现和应用掀…

【BASH】回顾与知识点梳理(十四)

【BASH】回顾与知识点梳理 十四 十四. 文件与目录的默认权限与隐藏权限14.1 文件预设权限:umaskumask 的利用与重要性:专题制作 14.2 文件隐藏属性chattr (配置文件案隐藏属性)lsattr (显示文件隐藏属性) 14.3 文件特殊权限: SUID, SGID, SBI…

打造企业或者个人IP引流法

打造企业或者个人IP引流法. 大家好,我是百收网SEO编辑:狂潮老师,今天给大家分享企业IP打造的方法 首先我们想让人知道你的企业叫什么,怎么找到你的企业 这个时候我们就需要去各大平台发布信息,客户想了解直接去搜索…

Torch基本操作扫盲

torch.rand是均匀分布采样 torch.randn是标准正态分布采样 同时设定好了GPU种子 高斯/正态分布

Android多屏幕支持-Android12

Android多屏幕支持-Android12 1、概览及相关文章2、屏幕窗口配置2.1 配置xml文件2.2 DisplayInfo#uniqueId 屏幕标识2.3 adb查看信息 3、配置文件解析3.1 xml字段读取3.2 简要时序图 4、每屏幕焦点 android12-release 1、概览及相关文章 AOSP > 文档 > 心主题 > 多屏…

Rabbitmq消息不丢失

目录 一、消息不丢失1.消息确认2.消息确认业务封装2.1 发送确认消息测试2.2 消息发送失败,设置重发机制 一、消息不丢失 消息的不丢失,在MQ角度考虑,一般有三种途径: 1,生产者不丢数据 2,MQ服务器不丢数据…