Python中常用的8個繪圖函數(shù)使用詳解
常用繪圖函數(shù)
目前只集成了三種繪圖函數(shù),即plot, scatter和bar,這個體量不到matplotlib提供的繪圖函數(shù)的十分之一,接下來要做的自然是擴(kuò)充繪圖函數(shù)庫。
但一次性也不宜擴(kuò)充太多,下面列出一些常用的繪圖函數(shù),如無說明,小寫的x,y,z表示一維數(shù)組;大寫的X,Y,Z表示二維數(shù)組,也就是矩陣;×表示這種繪圖函數(shù)不支持這種坐標(biāo),或者不建議在這種坐標(biāo)中繪圖。
| 函數(shù) | 類別 | 2D | polar | 3D | 備注 |
|---|---|---|---|---|---|
| imshow | 圖像 | X | × | × | |
| pcolormesh | 偽彩圖 | [X,Y,]Z | X,Y,Z | × | |
| plot | 曲線圖 | x[,y] | x[,y] | x,y[,z] | |
| scatter | 散點圖 | 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 | × |
從這個圖可以看出,2D坐標(biāo)中,大部分函數(shù)只支持兩個變量,極坐標(biāo)亦然,而3D坐標(biāo)中要么不支持繪圖,要么支持x,y或者x,y,z三種繪圖坐標(biāo)。
單選框的更改邏輯
完成這個功能的改動,只需先更改cbTypeChanged,再更改cbProjNone, cbProjPolar以及cbProj3d這三個函數(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)接下來是設(shè)置projection的函數(shù),之前我們一直把plot取名為點線圖,這個先留著,但不妨礙把曲線圖作為另一個名字加上去,但“點線圖”這個名字暫時還不能刪,因為DrawSystem那邊的代碼還沒有改。
def cbProjNone(self, t):
if t in ("點線圖", "曲線圖"):
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 ("點線圖", "曲線圖"):
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')最后,新建一個全局的常量,用于存儲函數(shù)名,并在創(chuàng)建slctDct字典時調(diào)用。
def initConst(self):
self.TYPES = [
"點線圖", "曲線圖", "散點圖", "圖像", "偽彩圖",
"條形圖", "橫向條形圖", "莖葉圖", "階梯圖"]修改后的結(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",
"點型" : "marker" , "點徑" : "markersize", "點色" : "markeredgecolor",
"標(biāo)簽" : "label" , "透明度" : "alpha", "層號" : "zorder"
}
self.STR_KEYS = ["標(biāo)簽"]
self.COM_KEYS = ["線型", "點型"]
self.NUM_KEYS = ["線寬", "點徑", "透明度"]
self.INT_KEYS = ["層號"]
self.CLR_KEYS = ["線色", "點色"]
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)簽", "層號", "透明度"]):
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 = {
"點型" : ['.', ',', '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]!=""}
# 繪圖類型和維度
# varDct 的格式是 {"sub":sub, "type":slctType, "dim":dim, "proj": proj}
class DrawType(ttk.Frame):
# ws為兩個combobox的寬
def __init__(self, master,
varDct = {"sub":"111", "type":'點線圖', "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 = [
"點線圖", "曲線圖", "散點圖", "圖像", "偽彩圖",
"條形圖", "橫向條形圖", "莖葉圖", "階梯圖"]
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 ("點線圖", "曲線圖"):
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 ("點線圖", "曲線圖"):
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個繪圖函數(shù)使用詳解的詳細(xì)內(nèi)容,更多關(guān)于python繪圖函數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解Python如何實現(xiàn)惰性導(dǎo)入-lazy import
如果你的 Python 程序程序有大量的 import,而且啟動非常慢,那么你應(yīng)該嘗試懶導(dǎo)入,本文分享一種實現(xiàn)惰性導(dǎo)入的一種方法,需要的可以參考一下2022-10-10
pyecharts在數(shù)據(jù)可視化中的應(yīng)用詳解
這篇文章主要介紹了pyecharts在數(shù)據(jù)可視化中的應(yīng)用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
python機(jī)器學(xué)習(xí)pytorch?張量基礎(chǔ)教程
這篇文章主要為大家介紹了python機(jī)器學(xué)習(xí)pytorch?張量基礎(chǔ)教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10

