广州哪个区最大,google企业网站seo,泰安有什么好的网络科技公司,建立网站的数据表文章目录 时间轴单帧跳转源代码 Python绘图系统#xff1a;
#x1f4c8;从0开始的3D绘图系统#x1f4c9;一套3D坐标#xff0c;多个函数#x1f4ca;散点图、极坐标和子图自定义控件#xff1a;绘图风格#x1f4c9;风格控件#x1f4ca;定制绘图风格坐标设置进阶
从0开始的3D绘图系统一套3D坐标多个函数散点图、极坐标和子图自定义控件绘图风格风格控件定制绘图风格坐标设置进阶动态更新组件导入外部文件导入txt
时间轴
三维并不是人类理解的极限毕竟我们生活在思维时空中。所以接下来要做的就是四维图形——加一个时间轴。
实际上这个项目创建之初就已经考虑到动图绘制的问题毕竟默认的绘图坐标是txyz。但是如果想实现动图绘制就必须要先设置一个额外的线程用于动态更新图像否则绘图循环压迫主进程会导致界面变得奇卡无比。
接下来就开始实现绘制动图的需求第一步绘制UI。先在setFrmCtrl中添加
# 动画控制
frm ttk.Frame(frmCtrl, width320)
frm.pack(sidetk.TOP, filltk.X)
self.setAnimateFrame(frm)然后实现具体的self.setAnimateFrame
def setAnimateFrame(self, frm):pDct dict(sidetk.LEFT, filltk.X, padx2)self.aniDelay tk.StringVar()self.aniDelay.set(100)ttk.Label(frm, text延时/毫秒).pack(**pDct)ttk.Entry(frm, width5, textvariableself.aniDelay).pack(**pDct)self.aniFrameNum tk.StringVar()self.aniFrameNum.set(100)ttk.Label(frm, text帧数).pack(**pDct)ttk.Entry(frm, width5, textvariableself.aniFrameNum).pack(**pDct)self.tIndex 0 # 当前帧数ttk.Button(frm, width3, text ⇦, commandself.btnPreFrame).pack(**pDct)ttk.Button(frm, width3, text▶, commandself.btnAniStart).pack(**pDct)ttk.Button(frm, width3, text⇨, commandself.btnNextFrame).pack(**pDct)def btnAniStart(self): passdef btnPreFrame(self): passdef btnNextFrame(self): pass延时表示当自动绘制动图时两帧间隔时间帧数表示总共绘制的时间个数。三个按钮分别用于向前一帧、向后一帧以及动态播放。
单帧跳转
坐标t的工作原理和xyz并不相同毕竟每次调用时间参数的时候都只需要调用某一点的时间。所以现有的设置坐标数据的方法就不适用了需要更改readDatas函数
# 读取坐标轴al的数据
def readDatas(self, al):dct {}data {}for flag in self.drawTypeDim.getDim():data[flag] al.setData(flag, **dct)if flagt: dct[t] data[t][self.tIndex]else:dct[flag] data[flag]return data然后再更新一下绘图函数其实只是取消t作为绘图坐标轴的地位
def btnDrawImg(self):self.fig.clf()self.axDct {}for al in self.als:ax self.setDrawAxis(al)data self.readDatas(al)draw self.drawDct[al.getDrawType()]style al.getStyle()keys al.getDrawDim().replace(t,)draw(ax, data, keys, style)self.fig.subplots_adjust(left0.1, right0.95, top0.95, bottom0.08)self.canvas.draw()最后实现一下btnNextFrame
def btnNextFrame(self): num int(self.aniFrameNum.get())self.tIndex (self.tIndex 1) % numself.btnDrawImg()效果如下至此我们离自动化动态绘图只剩下一个多线程了。 源代码
本文只更改了ds.py中的源代码其他代码可查看这篇博客定制风格的绘图系统
import tkinter as tk
import tkinter.ttk as ttk
from tkinter.filedialog import askopenfilenameimport matplotlib
import matplotlib as mpl
mpl.use(TkAgg)
import matplotlib.backends.backend_tkagg as mbb
from matplotlib.figure import Figureimport numpy as npfrom alist import AxisList
from base import DrawTypeclass DarwSystem():def __init__(self):self.root tk.Tk()self.root.title(数据展示工具)self.data {}self.als []self.initConst()self.setFrmCtrl()frmFig ttk.Frame(self.root)frmFig.pack(sidetk.LEFT,filltk.BOTH,expandtk.YES)self.setFrmFig(frmFig)self.root.mainloop()def initConst(self):self.TYPES (点线图, 散点图, 条形图)self.drawDct {点线图 : self.drawPlot,散点图 : self.drawScatter,条形图 : self.drawBar}# ! 设置def setFrmCtrl(self):frmCtrl ttk.Frame(self.root,width320)frmCtrl.pack(sidetk.RIGHT, filltk.Y)# 主控Framefrm ttk.Frame(frmCtrl, width320)frm.pack(sidetk.TOP, filltk.X)self.setCtrlButtons(frm)# 动画控制frm ttk.Frame(frmCtrl, width320)frm.pack(sidetk.TOP, filltk.X)self.setAnimateFrame(frm)self.frmAxis ttk.Frame(frmCtrl)self.frmAxis.pack(sidetk.TOP, filltk.X)self.addLast(None)# ! 工具栏def setCtrlButtons(self, frm):self.drawTypeDim DrawType(frm)self.drawTypeDim.pack(sidetk.LEFT)ttk.Button(frm, text,width3,commandself.btnDrawImg).pack(sidetk.LEFT)ttk.Button(frm, text,width3,commandself.btnLoadData).pack(sidetk.LEFT)btn ttk.Button(frm, text, width3)btn.pack(sidetk.LEFT)btn.bind(Button-1, self.addLast)btn ttk.Button(frm, text-, width3)btn.pack(sidetk.LEFT)btn.bind(Button-1, self.deleteLast)# ! 动画控制def setAnimateFrame(self, frm):pDct dict(sidetk.LEFT, filltk.X, padx2)self.aniDelay tk.IntVar()self.aniDelay.set(100)ttk.Label(frm, text延时/毫秒).pack(**pDct)ttk.Entry(frm, width5, textvariableself.aniDelay).pack(**pDct)self.aniFrameNum tk.IntVar()self.aniFrameNum.set(100)ttk.Label(frm, text帧数).pack(**pDct)ttk.Entry(frm, width5, textvariableself.aniFrameNum).pack(**pDct)self.tIndex 0 # 当前帧数ttk.Button(frm, width3, text ⇦, commandself.btnPreFrame).pack(**pDct)ttk.Button(frm, width3, text▶, commandself.btnAniStart).pack(**pDct)ttk.Button(frm, width3, text⇨, commandself.btnNextFrame).pack(**pDct)def btnAniStart(self): passdef btnPreFrame(self): passdef btnNextFrame(self): num self.aniFrameNum.get()self.tIndex (self.tIndex 1) % numself.btnDrawImg()# 添加一组坐标系def addLast(self, evt):title f坐标{len(self.als)}al AxisList(self.frmAxis, title, 1, [5,10,30], self.TYPES, self.drawTypeDim.getDct())al.pack(sidetk.TOP, filltk.X)self.als.append(al)# 删除一组坐标系def deleteLast(self, evt):self.als[-1].pack_forget()del self.als[-1]# 加载数据 // 暂时处于弃用状态def btnLoadData(self):name askopenfilename()data np.genfromtxt(name)for i, flag in enumerate(xyz):if i data.shape[1]:returnself.AL.setOneMode(flag, 外部导入)self.data[flag] self.AL.setData(flag, data data[:,i])# 读取坐标轴al的数据def readDatas(self, al):dct {}data {}for flag in al.getDrawDim():data[flag] al.setData(flag, **dct)if flagt: dct[t] data[t][self.tIndex]else:dct[flag] data[flag]return data# 设置绘图坐标def setDrawAxis(self, al):sub int(al.getSub())print(sub)if sub in self.axDct:return self.axDct[sub]p al.getProj() if p None:self.axDct[sub] self.fig.add_subplot(sub)else:self.axDct[sub] self.fig.add_subplot(sub, projectionp)return self.axDct[sub]# 单帧绘图函数def btnDrawImg(self):self.fig.clf()self.axDct {}for al in self.als:ax self.setDrawAxis(al)data self.readDatas(al)draw self.drawDct[al.getDrawType()]style al.getStyle()keys al.getDrawDim().replace(t,)draw(ax, data, keys, style)self.fig.subplots_adjust(left0.1, right0.95, top0.95, bottom0.08)self.canvas.draw()def drawBar(self, ax, data, keys, style):ax.bar(data[x], data[y])def drawPlot(self, ax, data, keys, style):ax.plot(*[data[key] for key in keys], **style)def drawScatter(self, ax, data, keys, style):ax.scatter(*[data[key] for key in keys])def setFrmFig(self, frmFig):self.fig Figure()self.canvas mbb.FigureCanvasTkAgg(self.fig,frmFig)self.canvas.get_tk_widget().pack(sidetk.TOP,filltk.BOTH,expandtk.YES)self.toolbar mbb.NavigationToolbar2Tk(self.canvas,frmFig,pack_toolbarFalse)self.toolbar.update()self.toolbar.pack(sidetk.RIGHT)if __name__ __main__:test DarwSystem()