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