Python matplotlib繪圖風格詳解
Python繪圖系統(tǒng):
從0開始的3D繪圖系統(tǒng)|一個3D坐標系,多個函數(shù)
自定義控件:極坐標繪圖
創(chuàng)建控件
盡管從matplotlib的角度來說,繪圖風格也算是圖像類型的一部分,但諸如點線字體標題等內(nèi)容太過復雜,為了減輕DrawType的負擔,所以新建一個組件。有了DrawType的經(jīng)驗,那么DrawStyle類在參數(shù)設置上就比較輕車熟路,整體框架大致如下
class DrawStyle(ttk.Frame):
def __init__(self, master,
varDct, ws=None, func=None, **options):
super().__init__(master, **options)
self.pack()
def initVars(self):
pass
def initWidgets(self):
pass當然,本文只給出一個大致的框架,由于DrawStyle的內(nèi)容注定很多,所以要用一篇單獨的博客來表達。但新控件的加入,必然導致其他內(nèi)容發(fā)生變化,所以接下來需要修改一下AxisList控件
更改AxisList布局
但在豐富細節(jié)之前,需要修改一下AxisList的布局??紤]到繪圖風格并不是經(jīng)常會用到的控件,所以平時給隱藏起來。其initWidgets函數(shù)修改如下,之前直接依托在主frame中的AxisFrame,如今都要放到self._a中。而各種按鈕都放在工具欄self._b中。
def initWidgets(self, title, widths):
self.btn = ttk.Button(self, text=title, width=sum(widths)+5,
command=self.Click)
self.btn.pack(side=tk.TOP, fill=tk.X, expand=tk.YES)
self._c = ttk.Frame(self) # 此為主frame
self._b = ttk.Frame(self._c) # 此外工具欄控件
self._a = ttk.Frame(self._c) # 此為坐標軸
self._s = ttk.Frame(self._c) # 此為繪圖風格控件
self._b.pack(side=tk.TOP)
self._a.pack(side=tk.TOP)
self._s.pack(side=tk.TOP)
self.collapsed = True
self.Click()然后添加風格按鈕
def initFeature(self, types, typeDct):
frm = self._b
# ...中間內(nèi)容不變
ttk.Button(frm, text="風格",width=5,
command=self.btnShowStyle).pack(side=tk.LEFT)
self.showStyle = FalsebtnShowStyle的邏輯也是老生常談了
def btnShowStyle(self):
self.showStyle = not self.showStyle
if self.showStyle:
self.sf.pack(side=tk.TOP, fill=tk.X)
else:
self.sf.pack_forget()風格初始化如下
def initStyleFrame(self):
self.sf = DrawStyle(self._s)當然這里什么都沒有,為了演示功能,可以中先放個按鈕看下
def initStyleFrame(self):
self.sf = tk.LabelFrame(self._s, text="繪圖風格")
ttk.Button(self.sf, text="點我").pack(side=tk.LEFT)現(xiàn)在的AxisList控件大致如下

源代碼
目前所有代碼已經(jīng)超過350行了,如果都貼上來并不適合閱讀,下面只給出AxisList的代碼。其余代碼可以查看上一篇博客(多子圖繪圖系統(tǒng))的末尾。
class AxisList(ttk.Frame):
def __init__(self, master,
title, mode, widths,
types, typeDct, # 繪圖類型Combobox的參數(shù)
**options):
super().__init__(master, **options)
self.pack()
self.afs = {}
self.data = {}
self.initWidgets(title, widths)
self.initFeature(types, typeDct)
self.initAxis(mode, widths)
self.initStyleFrame()
def initWidgets(self, title, widths):
self.btn = ttk.Button(self, text=title, width=sum(widths)+5,
command=self.Click)
self.btn.pack(side=tk.TOP, fill=tk.X, expand=tk.YES)
self._c = ttk.Frame(self) # 此為主控件
self._b = ttk.Frame(self._c) # 此外工具欄控件
self._a = ttk.Frame(self._c) # 此為坐標軸
self._s = ttk.Frame(self._c) # 此為繪圖風格控件
self._b.pack(side=tk.TOP)
self._a.pack(side=tk.TOP)
self._s.pack(side=tk.TOP)
self.collapsed = True
self.Click()
# 初始化工具欄
def initFeature(self, types, typeDct):
frm = self._b
frm.pack(pady=2, side=tk.TOP, fill=tk.X)
ttk.Button(frm, text="導入",width=5,
command=self.btnLoadData).pack(side=tk.LEFT)
ttk.Button(frm, text="導出",width=5,
command=self.btnLoadData).pack(side=tk.LEFT)
self.drawTypeDim = DrawType(frm, typeDct,
func=self.dimChanged)
self.drawTypeDim.pack(side=tk.LEFT, padx=2)
self.vis = {L : True for L in 'txyz'}
ttk.Button(frm, text="風格",width=5,
command=self.btnShowStyle).pack(side=tk.LEFT)
self.showStyle = False
# 初始化坐標軸
def initAxis(self, mode, widths):
for flag in 'txyz':
self.afs[flag] = AxisFrame(self._a, flag, mode, widths)
self.afs[flag].pack(side=tk.TOP, fill=tk.X)
self.vis = {L : L in self.getDrawDim() for L in 'txyz'}
self.updateVisible()
# 初始化風格控件
def initStyleFrame(self):
self.sf = DrawStyle(self._s)
# 維度改變時的回調(diào)函數(shù)
def dimChanged(self, evt):
txyz = self.getDrawDim()
for flag in 'txyz':
self.vis[flag] = flag in txyz
self.updateVisible()
# 更新隱藏和顯示
def updateVisible(self):
for flag in 'txyz':
self.afs[flag].pack_forget()
for flag in 'txyz':
if self.vis[flag]:
self.afs[flag].pack(side=tk.TOP, fill=tk.X)
#
def btnShowStyle(self):
self.showStyle = not self.showStyle
if self.showStyle:
self.sf.pack(side=tk.TOP, fill=tk.X)
else:
self.sf.pack_forget()
def getSub(self):
return self.drawTypeDim.getSub()
def getProj(self):
return self.drawTypeDim.getProj()
def getDrawType(self):
return self.drawTypeDim.getType()
def getDrawDim(self):
return self.drawTypeDim.getDim()
# 加載數(shù)據(jù)
def btnLoadData(self):
name = askopenfilename()
data = np.genfromtxt(name)
for i, flag in enumerate('xyz'):
if i >= data.shape[1]:
return
self.setOneMode(flag, "外部導入")
self.data[flag] = self.setData(flag, data[:,i])
def Click(self):
if self.collapsed:
self._c.pack(side=tk.TOP, fill=tk.BOTH, expand=tk.YES)
else:
self._c.pack_forget()
self.collapsed = not self.collapsed
# 設置數(shù)據(jù)
def setData(self, flag, data=None, **options):
return self.afs[flag].setData(data, **options)
# 設置模式
def setOneMode(self, flag, mode):
self.afs[flag].setMode(mode)
```到此這篇關于Python matplotlib繪圖風格詳解的文章就介紹到這了,更多相關python matplotlib內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python 中l(wèi)ist ,set,dict的大規(guī)模查找效率對比詳解
這篇文章主要介紹了Python 中l(wèi)ist ,set,dict的大規(guī)模查找效率對比詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-10-10
Python中如何使用多線程優(yōu)化For循環(huán)
這篇文章主要為大家詳細介紹了在Python中如何使用多線程實現(xiàn)優(yōu)化For循環(huán),文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2025-01-01
深入解析神經(jīng)網(wǎng)絡從原理到實現(xiàn)
這篇文章主要介紹了深入解析神經(jīng)網(wǎng)絡從原理到實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-07-07

