当前位置: 首页 > news >正文

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

文章目录

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

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.lryc.cn/news/183316.html

相关文章:

  • Postman使用实例
  • 【ES的优势和原理及分布式开发的好处与坏处】
  • Autosar诊断实战系列23-CanTp半/全双工及相关工程问题思考
  • 【Pandas】数据分组groupby
  • 【图像处理GIU】图像分割(Matlab代码实现)
  • Java中的锁与锁优化技术
  • 布局与打包
  • UVa11324 - The Largest Clique
  • 【Linux】TCP的服务端(守护进程) + 客户端
  • 1.7. 找出数组的第 K 大和原理及C++实现
  • 基于微信小程序的付费自习室
  • 纪念在CSDN的2048天
  • 云原生Kubernetes:简化K8S应用部署工具Helm
  • qml保姆级教程五:视图组件
  • 2310d编译不过
  • CleanMyMac X4.14.1最新版本下载
  • 芯驰D9评测(3)--建立开发环境
  • 阿里云服务器IP地址查询方法(公网IP和私网IP)
  • 第47节——使用bindActionCreators封装actions模块
  • QT、c/c++通过宏自动判断平台
  • 对比表:阿里云轻量应用服务器和服务器性能差异
  • 中国1km分辨率月最低温和最高温度数据集(1901-2020)
  • EasyX图形库note4,动画及键盘交互
  • C++设计模式-原型(Prototype)
  • [补题记录] Atcoder Beginner Contest 322(E)
  • 目标检测算法改进系列之Backbone替换为FocalNet
  • buuctf-[BSidesCF 2020]Had a bad day 文件包含
  • Elasticsearch:什么时候应该考虑在 Elasticsearch 中添加协调节点?
  • Dubbo3应用开发—Dubbo注册中心引言
  • AS环境,版本问题,android开发布局知识