【最终版】tkinter+matplotlib实现一个强大的绘图系统

news2024/12/23 20:54:18

文章目录

    • 辅助坐标轴功能实现
    • 代码优化
    • 源代码

Python绘图系统:

  • 前置源码: Python打造动态绘图系统
  • 📈一 三维绘图系统 📈二 多图绘制系统📈三 坐 标 轴 定 制
  • 📈四 定制绘图风格 📈五 数据生成导入📈六 三维动态演示
  • 坐标列表进阶:导出数据📌系统菜单📌批量文件导入📌辅助坐标轴
  • 绘图类型进阶:坐标映射📌八种绘图函数📌坐标和绘图函数设置📌所有绘图函数📌强大的绘图系统

这是本系列博客的第28篇,从功能来说,这个小巧的绘图系统应该算是比较完备了。

辅助坐标轴功能实现

之前在AxisList中实现了辅助坐标轴的添加和删除功能,但只是实现了交互逻辑,没有实现真正的辅助功能。

这个功能也很容易实现,只需仿造getXYZ,设计一个getABC

def getABC(self):
    return [key in self.ABC if key in self.afs]

然后更改readPython函数,因为可能会输入的变量太多,再用这种readPython(self, t=None, x=None, y=None, z=None)的写法显然就不合适了。所以将其改为

def readPython(self, dct):
    locals().update(dct)
    self.data = eval(self.srcText.get())
    return self.data

与此同时,一切参与过dct参数传递的函数,其**txty的两个星号都要去掉,写成类似下面的形式

def setData(self, data=None, dct={}):
    if self.mode.get() == "序列":
        return self.getArray()
    elif self.mode.get() == "导入":
        return self.loadData(data)
    else:
        return self.readPython(dct)

最后更改DrawSystem中的readDatas函数

def readDatas(self, al):
    dct = {}
    data = {}
    if al.hasTimeAxis():
        data['t'] = al.setData('t')
        dct['t'] = data['t'][self.tIndex]
    for flag in al.getABC():
        data[flag] = al.setData(flag, dct=dct)
        dct[flag] = data[flag]
    for flag in al.getXYZ():
        data[flag] = al.setData(flag, dct=dct)
        dct[flag] = data[flag]
    return data

最后效果如下

在这里插入图片描述

代码优化

至此,本阶段希望实现的功能就实现得七七八八了,接下来要对代码做一些优化,包括以下几个方面

代码清理

由于DrawType继承了更加全面的设置功能,所以原本需要调用的函数现在并不需要调用了,从而产生了大量不需要的函数,这个就自行检测,把没有调用的函数都删掉就对了。

另外,全局的导入数据功能,目前处于养老状态,其具体代码估计以后也不能用了,所以接口保留,但代码删除。

接口优化

首先AxisList有一个types参数,这个参数原本是要传入绘图类型的,现在绘图类型都在DrawType中,所以这个参数可以取消。

DrawType的传入参数里有一个回调函数,默认是None,这会导致报错,所以将其默认值改为lambda x:x

常量、变量和函数名称

AxisFrame中的坐标轴设置模式,目前有四种,即"序列化", “源代码”, “外部导入”, “无数据”,感觉这种命名不太规整,故修改为

“序列”, “源码”, “导入”, “无数据”

这四个参数用的次数太多,所以改动的时候需要细致,按理说这些应该写成变量,这样的话也方便国际化,考虑到本身我也没想把这个项目写太长,所以就算了。

而文字长度发生变化,使得combobox的宽度就显得太长了,所以再调整一下布局。

源代码

目前四个文件的总代码行数大概800行左右,我的目标是用1000行代码实现一个功能完备且强大的绘图系统。接下来希望实现不同坐标轴的关联,以实现插值、拟合等进阶功能,并接入几个用于示例的全局优化代码,进一步提高程序的实用性。

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

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

相关文章

lv7 嵌入式开发-网络编程开发 11 TCP管理与UDP协议

目录 1 TCP管理 1.1 三次握手 1.2 四次挥手 1.3 保活计时器 2 wireshark安装及实验 3.1 icmp协议抓包演示 3.2 tcp协议抓包演示 3 UDP协议 3.1 UDP 的主要特点: 4 练习 1 TCP管理 1.1 三次握手 TCP 建立连接的过程叫做握手。 采用三报文握手&#xff1…

代码随想录算法训练营第五十九天 | 647. 回文子串 516.最长回文子序列

1. 回文子串 647. 回文子串 - 力扣(LeetCode) 一个子串左右两个元素相等,并且中间对称,才是回文子串 即 ij 时,[i1: j-1]对称 dp[i][j]: [i:j] 是否是回文字串 当 子串长度大于2 由 dp[i1][j-1] 推出…

协议栈——创建套接字

前面几篇文章讲解的是应用程序使用Socket间接通知协议栈进行的连接,通信阶段,那么从现在开始讲解协议栈和网卡驱动的故事 回顾上篇文章,我们从第一阶段创建套接字,协议栈返回描述符讲起~~~ 协议栈结构 首先来看下协议栈的大致结…

【Python基础】数据容器的切片操作和集合

文章目录 前言一、切片操作1.1 什么是切片?1.2 如何使用切片? 基本切片带步长的切片省略起始和结束索引逆序切片二、集合2.1 什么是集合?2.2 如何定义集合?2.3 集合常用函数1. add()2. remove()3. discard()4. pop()5. clear() 总…

电子器件系列52:达林顿晶体管阵列

其实以前已经学到过,最近在网上看到有的厂家的规格书全部是中文的,一个叫华冠,还有一个叫中科芯,我直接贴它们家的规格书比较方便 其实都是达林顿晶体管阵列 b站上好多视频,搜索达林顿阵列就可以了,这个讲得…

[应用推荐]Web Scraper——轻量数据爬取利器

对于日常的简单网页内容爬取,学习Python等投入太高,可以考虑使用这个Chrome工具。 以下为收集的具体信息,按需取用。 以下内容来自web ScraperWeb Scraper - The #1 web scraping extensionThe most popular web scraping extension. Start …

[计算机入门] Windows附件程序介绍(工具类)

3.14 Windows附件程序介绍(工具类) 3.14.1 计算器 Windows系统中的计算器是一个内置的应用程序,提供了基本的数学计算功能。它被设计为一个方便、易于使用的工具,可以满足用户日常生活和工作中的基本计算需求。 以下是计算器程序的主要功能&#xff1a…

栈的概念|动态顺序栈的详细解析|静态顺序栈链式栈的代码参考

前言 今天我们将学习数据结构中的栈,它是一种特殊的线性表。why——在前面我们学习顺序表、链表它们都属于线性表,它们可以在任意位置进行插入和删除数据;但是今天我们学习栈,它只能在一端进行插入和删除。下面我们就来学习并实现…

[补题记录] Atcoder Beginner Contest 322(E)

URL:https://atcoder.jp/contests/abc322 目录 E Probelm/题意 Thought/思路 Code/代码 E Probelm/题意 有 N 个改进计划,每个计划可以执行一次;有 K 个参数,每个计划可以将所有参数提升固定值,即计划 i 可以为第…

[C国演义] 第十三章

第十三章 三数之和四数之和 三数之和 力扣链接 根据题目要求: 返回的数对应的下标各不相同三个数之和等于0不可包含重复的三元组 – – 即顺序是不做要求的 如: [-1 0 1] 和 [0, 1, -1] 是同一个三元组输出答案顺序不做要求 暴力解法: 排序 3个for循环 去重 — — N^3, …

leetcode 343.整数拆分、96.不同的二叉搜索树

343.整数拆分 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: n 10 输出: 36…

游戏设计模式专栏(五):三步学会原型模式

引言 大家好,我是亿元程序员,一位有着8年游戏行业经验的主程。 本系列是《和8年游戏主程一起学习设计模式》,让糟糕的代码在潜移默化中升华,欢迎大家关注分享收藏订阅。 原型模式在游戏开发中是一种重要的设计模式,…

做外贸独立站选Shopify还是WordPress?

现在确实会有很多新人想做独立站,毕竟跨境电商平台内卷严重,平台规则限制不断升级,脱离平台“绑架”布局独立站,才能获得更多流量、订单、塑造品牌价值。然而,在选择建立外贸独立站的过程中,选择适合的建站…

Spring Bean 作用域与生命周期

1 Spring Bean 作用域 Spring 3 中为 Bean 定义了 5 中作用域,分别为 singleton(单例)、prototype(原型)、 request、session 和 global session,5 种作用域说明如下:singleton :单例…

布局与打包

属性栏直接输入值,比代码更直观方便。 打包:

五、运算表达式

5、运算表达式 1.3、运算表达式 运算表达式只能用于属性上,而不能在[[]]中使用 1.3.1、算术运算 thymeleaf可以使用以下算术运算符: , - , * , / , %; 示例 TestServlet中添加两个整数值 request.setAttribute("num1", 6); …

前端搭建名言生成器(内附源码)

The sand accumulates to form a pagoda ✨ 写在前面✨ JS是什么?✨ 名言生成器✨ 页面搭建✨ 功能实现 ✨ 写在前面 在上周我们通过HTML、CSS实现了一个简单的‘我的相册‘页面的搭建,很多伙伴呢跟我说难道前端就只能做一些页面搭建的工作吗&#xff1…

带头双向循环链表

目录 1 链表的种类1.1 第一对1.2 第二对1.3 第三对1.4 常用 2 带头双向循环链表的实现2.1 创建2.2 初始化2.3 打印2.4 尾插2.5 尾删2.6 头插2.7 头删2.7.1 两个变量2.7.2 三个变量 2.8 查找x所在位置2.9 在pos节点前插入x2.10 删除pos节点2.11 销毁链表 1 链表的种类 1.1 第一…

AS环境,版本问题,android开发布局知识

项目模式下有一个build.gradle,每个模块也有自己的build.gradle Android模式下有多个build.gradle,汇总在一起。(都会有标注是哪个模块下的) C:\Users\Administrator\AndroidStudioProjects 项目默认位置 Java web项目与android项目的区别…

队列(循环数组队列,用队列实现栈,用栈实现队列)

基础知识 队列(Queue):先进先出的数据结果,底层由双向链表实现 入队列:进行插入操作的一端称为队尾出队列:进行删除操作的一端称为对头 常用方法 boolean offer(E e) 入队 E(弹出元素的类型) poll() 出队 peek() 获取队头 int size 获取队列元素个数 boolean isEmpty(…