文章目录

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

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行代码实现一个功能完备且强大的绘图系统。接下来希望实现不同坐标轴的关联,以实现插值、拟合等进阶功能,并接入几个用于示例的全局优化代码,进一步提高程序的实用性。