Python中常用的8個(gè)繪圖函數(shù)使用詳解
常用繪圖函數(shù)
目前只集成了三種繪圖函數(shù),即plot, scatter和bar,這個(gè)體量不到matplotlib提供的繪圖函數(shù)的十分之一,接下來(lái)要做的自然是擴(kuò)充繪圖函數(shù)庫(kù)。
但一次性也不宜擴(kuò)充太多,下面列出一些常用的繪圖函數(shù),如無(wú)說(shuō)明,小寫(xiě)的x,y,z表示一維數(shù)組;大寫(xiě)的X,Y,Z表示二維數(shù)組,也就是矩陣;×表示這種繪圖函數(shù)不支持這種坐標(biāo),或者不建議在這種坐標(biāo)中繪圖。
函數(shù) | 類(lèi)別 | 2D | polar | 3D | 備注 |
---|---|---|---|---|---|
imshow | 圖像 | X | × | × | |
pcolormesh | 偽彩圖 | [X,Y,]Z | X,Y,Z | × | |
plot | 曲線圖 | x[,y] | x[,y] | x,y[,z] | |
scatter | 散點(diǎn)圖 | x,y/X,Y | x,y | x,y,[,z] | 可為任意維度 |
stem | 莖葉圖 | x,y | x,y | x,y[,z] | |
step | 階梯圖 | x,y | x,y | x,y[,z] | |
bar | 條形圖 | x,y | x,y | x,y[,z] | |
barh | 橫向條形圖 | x,y | x,y | × |
從這個(gè)圖可以看出,2D坐標(biāo)中,大部分函數(shù)只支持兩個(gè)變量,極坐標(biāo)亦然,而3D坐標(biāo)中要么不支持繪圖,要么支持x,y或者x,y,z三種繪圖坐標(biāo)。
單選框的更改邏輯
完成這個(gè)功能的改動(dòng),只需先更改cbTypeChanged,再更改cbProjNone, cbProjPolar以及cbProj3d這三個(gè)函數(shù)就可以了。
def cbTypeChanged(self, evt): t = self.drawVars['type'].get() p = self.drawVars['proj'].get() if t in ("圖像"): self.wDct['proj']['value'] = ("None") elif t in ("橫向條形圖", "偽彩圖"): self.wDct['proj']['value'] = ("None", "polar") else: self.wDct['proj']['value'] = ("None", "3d", "polar") projs = self.wDct['proj']['value'] if p not in projs: self.drawVars['proj'].set(projs[0]) self.cbProjChanged(None)
接下來(lái)是設(shè)置projection的函數(shù),之前我們一直把plot取名為點(diǎn)線圖,這個(gè)先留著,但不妨礙把曲線圖作為另一個(gè)名字加上去,但“點(diǎn)線圖”這個(gè)名字暫時(shí)還不能刪,因?yàn)镈rawSystem那邊的代碼還沒(méi)有改。
def cbProjNone(self, t): if t in ("點(diǎn)線圖", "曲線圖"): self.wDct['dim']['value'] = ('x', 'xy') elif t in ("圖像"): self.wDct['dim']['value'] = ('x') elif t in ("偽彩圖"): self.wDct['dim']['value'] = ('x', 'xyz') else: self.wDct['dim']['value'] = ('xy') def cbProjPolar(self, t): if t in ("點(diǎn)線圖", "曲線圖"): self.wDct['dim']['value'] = ('x', 'xy') elif t in ("偽彩圖"): self.wDct['dim']['value'] = ('xyz') else: self.wDct['dim']['value'] = ('xy') def cbProj3d(self, t): self.wDct['dim']['value'] = ('xy', 'xyz')
最后,新建一個(gè)全局的常量,用于存儲(chǔ)函數(shù)名,并在創(chuàng)建slctDct字典時(shí)調(diào)用。
def initConst(self): self.TYPES = [ "點(diǎn)線圖", "曲線圖", "散點(diǎn)圖", "圖像", "偽彩圖", "條形圖", "橫向條形圖", "莖葉圖", "階梯圖"]
修改后的結(jié)果如圖所示
源代碼
下面給出base.py的源代碼。
import numpy as np import tkinter as tk import tkinter.ttk as ttk class DrawStyle(ttk.Frame): def __init__(self, master, varDct={}, ws=None, func=None, **options): super().__init__(master, **options) self.pack() self.initConst() self.initVars() self.initWidgets() def initConst(self): self.VAR_LABS = { "線型" : "linestyle", "線寬" : "linewidth", "線色" : "color", "點(diǎn)型" : "marker" , "點(diǎn)徑" : "markersize", "點(diǎn)色" : "markeredgecolor", "標(biāo)簽" : "label" , "透明度" : "alpha", "層號(hào)" : "zorder" } self.STR_KEYS = ["標(biāo)簽"] self.COM_KEYS = ["線型", "點(diǎn)型"] self.NUM_KEYS = ["線寬", "點(diǎn)徑", "透明度"] self.INT_KEYS = ["層號(hào)"] self.CLR_KEYS = ["線色", "點(diǎn)色"] def initVars(self): self.varDct = {key:tk.StringVar() for key in self.VAR_LABS} def newFrame(self): frm = ttk.Frame(self) frm.pack(side=tk.TOP, fill=tk.X) return frm def initWidgets(self): frm = self.newFrame() for i,key in enumerate(["標(biāo)簽", "層號(hào)", "透明度"]): tk.Label(frm, text=key).grid(row=0, column=i*2, padx=2) tmp = ttk.Entry(frm, width=10, textvariable=self.varDct[key]) tmp.grid(row=0, column=i*2+1, padx=2, pady=2) self.initLineMarker(frm) def initLineMarker(self, frm): enumDct = { "點(diǎn)型" : ['.', ',', '1', '2', '3', '4', '+', 'x', '|', '_', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 'o', 'v', '^', '<', '>', '8', 's', 'p', '*', 'h', 'H', 'D', 'd', 'P', 'X'], "線型" : ['-', '--', '-.', ':'] } for i in range(2): key = self.COM_KEYS[i] ttk.Label(frm, text=key).grid(row=i+1, column=0, padx=2) tmp = ttk.Combobox(frm, width=10, textvariable=self.varDct[key]) tmp.grid(row=i+1, column=1, padx=2, pady=2) tmp['value'] = enumDct[key] key = self.NUM_KEYS[i] ttk.Label(frm, text=key).grid(row=i+1, column=2, padx=2) tmp = ttk.Entry(frm, width=10, textvariable=self.varDct[key]) tmp.grid(row=i+1, column=3, padx=2, pady=2) key = self.CLR_KEYS[i] ttk.Label(frm, text=key).grid(row=i+1, column=4, padx=2) tmp = ttk.Entry(frm, width=10, textvariable=self.varDct[key]) tmp.grid(row=i+1, column=5, padx=2, pady=2) def getOneVar(self, key): v = self.varDct[key].get() if v=="": return "" if key in NUM_KEYS: return float(v) elif key in INT_KEYS: return int(v) else: return v def getVarDct(self): dct = {self.VAR_LABS[key] : self.varDct[key].get() for key in self.varDct} return {key : dct[key] for key in dct if dct[key]!=""} # 繪圖類(lèi)型和維度 # varDct 的格式是 {"sub":sub, "type":slctType, "dim":dim, "proj": proj} class DrawType(ttk.Frame): # ws為兩個(gè)combobox的寬 def __init__(self, master, varDct = {"sub":"111", "type":'點(diǎn)線圖', "dim":"xyz", "proj": "3d"}, ws=None, func=None, **options): super().__init__(master, **options) self.pack() self.dimChanged = func self.initConst() self.initVar(varDct) self.initWidgets(ws) def initVar(self, varDct): self.drawVars = {key:tk.StringVar() for key in varDct} for key in self.drawVars: self.drawVars[key].set(varDct[key]) def initConst(self): self.TYPES = [ "點(diǎn)線圖", "曲線圖", "散點(diǎn)圖", "圖像", "偽彩圖", "條形圖", "橫向條形圖", "莖葉圖", "階梯圖"] def initWidgets(self, ws): if ws==None: ws = [5, 5, 5, 3] slctDct = {'type': self.TYPES, 'proj': ("None", "3d", "polar"), 'dim' : ("x", "xy", "xyz")} # 繪圖維度 keys = ['sub', 'type', 'proj', 'dim'] self.wDct = {} # 控件字典 # 此為設(shè)置子圖的Entry控件 self.wDct['sub'] = ttk.Entry(self, width=ws[0], textvariable=self.drawVars['sub']) for i, key in enumerate(keys[1:], 1): self.wDct[key] = ttk.Combobox(self, width=ws[i], textvariable=self.drawVars[key]) self.wDct[key]['value'] = slctDct[key] for key in keys: self.wDct[key].pack(side=tk.LEFT, padx=2) self.wDct['type'].bind('<<ComboboxSelected>>', self.cbTypeChanged) self.wDct['proj'].bind('<<ComboboxSelected>>', self.cbProjChanged) self.wDct['dim'].bind('<<ComboboxSelected>>', self.dimChanged) def cbTypeChanged(self, evt): t = self.drawVars['type'].get() p = self.drawVars['proj'].get() if t in ("圖像"): self.wDct['proj']['value'] = ("None") elif t in ("橫向條形圖", "偽彩圖"): self.wDct['proj']['value'] = ("None", "polar") else: self.wDct['proj']['value'] = ("None", "3d", "polar") projs = self.wDct['proj']['value'] if p not in projs: self.drawVars['proj'].set(projs[0]) self.cbProjChanged(None) def cbProjChanged(self, evt): p = self.drawVars['proj'].get() func = { 'None': self.cbProjNone, '3d': self.cbProj3d, 'polar' : self.cbProjPolar} d = self.wDct['dim'].get() t = self.drawVars['type'].get() func[p](t) dims = self.wDct['dim']['value'] if d not in dims: self.drawVars['dim'].set(dims[0]) self.dimChanged(None) def cbProjNone(self, t): if t in ("點(diǎn)線圖", "曲線圖"): self.wDct['dim']['value'] = ('x', 'xy') elif t in ("圖像"): self.wDct['dim']['value'] = ('x') elif t in ("偽彩圖"): self.wDct['dim']['value'] = ('x', 'xyz') else: self.wDct['dim']['value'] = ('xy') def cbProjPolar(self, t): if t in ("點(diǎn)線圖", "曲線圖"): self.wDct['dim']['value'] = ('x', 'xy') elif t in ("偽彩圖"): self.wDct['dim']['value'] = ('xyz') else: self.wDct['dim']['value'] = ('xy') def cbProj3d(self, t): self.wDct['dim']['value'] = ('xy', 'xyz') def getSub(self): return self.drawVars['sub'].get() def getType(self): return self.drawVars['type'].get() def getDim(self): return self.drawVars['dim'].get() def getProj(self): return self.drawVars['proj'].get() def getDct(self): return {key:self.drawVars[key].get() for key in self.drawVars}
以上就是Python中常用的8個(gè)繪圖函數(shù)使用詳解的詳細(xì)內(nèi)容,更多關(guān)于python繪圖函數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解Python如何實(shí)現(xiàn)惰性導(dǎo)入-lazy import
如果你的 Python 程序程序有大量的 import,而且啟動(dòng)非常慢,那么你應(yīng)該嘗試懶導(dǎo)入,本文分享一種實(shí)現(xiàn)惰性導(dǎo)入的一種方法,需要的可以參考一下2022-10-10pyecharts在數(shù)據(jù)可視化中的應(yīng)用詳解
這篇文章主要介紹了pyecharts在數(shù)據(jù)可視化中的應(yīng)用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06python機(jī)器學(xué)習(xí)pytorch?張量基礎(chǔ)教程
這篇文章主要為大家介紹了python機(jī)器學(xué)習(xí)pytorch?張量基礎(chǔ)教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10對(duì)django中foreignkey的簡(jiǎn)單使用詳解
今天小編就為大家分享一篇對(duì)django中foreignkey的簡(jiǎn)單使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07