Python中常用的8個(gè)繪圖函數(shù)使用詳解
常用繪圖函數(shù)
目前只集成了三種繪圖函數(shù),即plot, scatter和bar,這個(gè)體量不到matplotlib提供的繪圖函數(shù)的十分之一,接下來(lái)要做的自然是擴(kuò)充繪圖函數(shù)庫(kù)。
但一次性也不宜擴(kuò)充太多,下面列出一些常用的繪圖函數(shù),如無(wú)說(shuō)明,小寫的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 | 散點(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那邊的代碼還沒有改。
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]!=""}
# 繪圖類型和維度
# 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搭建APNS蘋果推送通知推送服務(wù)的相關(guān)模塊使用指南
這里總結(jié)了一份Python搭建蘋果推送通知推送服務(wù)的相關(guān)模塊使用指南,包括PyAPNs、基于twisted框架的pyapns以及apns-client三個(gè)模塊的介紹,需要的朋友可以參考下2016-06-06
Python api構(gòu)建tensorrt加速模型的步驟詳解
小編個(gè)人認(rèn)為python比c++更容易讀并且已經(jīng)有很多包裝很好的科學(xué)運(yùn)算庫(kù)(numpy,scikit等),今天通過本文給大家分享Python api構(gòu)建tensorrt加速模型的步驟,感興趣的朋友一起看看吧2021-09-09
Python基礎(chǔ)文件操作方法超詳細(xì)講解(詳解版)
文件就是操作系統(tǒng)為用戶或應(yīng)用程序提供的一個(gè)讀寫硬盤的虛擬單位,文件的核心操作就是讀和寫,這篇文章主要介紹了Python基礎(chǔ)文件操作方法超詳細(xì)講解的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-04-04
一文詳細(xì)介紹PyQt5 QPushButton() 的作用
通過本文的介紹,相信你已經(jīng)對(duì)PyQt5中的QPushButton控件有了深入的了解,從基礎(chǔ)介紹到常用屬性和方法,再到應(yīng)用場(chǎng)景和樣式定制,本文為你提供了全面的指南,感興趣的朋友跟隨小編一起看看吧2024-08-08
python列表推導(dǎo)式實(shí)現(xiàn)找出列表中長(zhǎng)度大于5的名字
這篇文章主要介紹了python列表推導(dǎo)式實(shí)現(xiàn)找出列表中長(zhǎng)度大于5的名字,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Python?yaml格式配置文件操作實(shí)戰(zhàn)教程
yaml是專門用來(lái)寫配置文件的語(yǔ)言,非常簡(jiǎn)潔和強(qiáng)大,用ini也能寫配置文件,看了yaml后,發(fā)現(xiàn)這個(gè)更直觀,更方便,有點(diǎn)類似于json格式,這篇文章主要介紹了Python?yaml格式配置文件操作的相關(guān)資料,需要的朋友可以參考下2025-11-11
Pygame游戲開發(fā)之太空射擊實(shí)戰(zhàn)盾牌篇
相信大多數(shù)8090后都玩過太空射擊游戲,在過去游戲不多的年代太空射擊自然屬于經(jīng)典好玩的一款了,今天我們來(lái)自己動(dòng)手實(shí)現(xiàn)它,在編寫學(xué)習(xí)中回顧過往展望未來(lái),在本課中,我們將為玩家添加一個(gè)盾牌以及一個(gè)用于顯示盾牌等級(jí)的欄2022-08-08
pymysql 開啟調(diào)試模式的實(shí)現(xiàn)
這篇文章主要介紹了pymysql 開啟調(diào)試模式的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Python實(shí)現(xiàn)動(dòng)態(tài)生成系統(tǒng)數(shù)據(jù)庫(kù)設(shè)計(jì)到Word文檔
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)填寫相關(guān)數(shù)據(jù)庫(kù)信息后,生成系統(tǒng)數(shù)據(jù)庫(kù)設(shè)計(jì)到word文檔,文中示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-06-06

