本人最近在做一個GUI項目時,需要用到matplotlib畫圖,寫完代碼運行時,發(fā)現(xiàn)所需要畫圖功能不能正常使用,在觸發(fā)畫圖事件后,畫布未更新,需要放大界面才能更新(奇葩吧)。
經(jīng)過資料查閱,發(fā)現(xiàn)需要畫圖函數(shù)后面添加
self.fig.canvas.draw_idle()
補充:解決PyQt5中使用柱狀圖和餅狀圖刷新問題
在做一款番茄鐘應(yīng)用,其中包含數(shù)據(jù)統(tǒng)計功能,如下圖:
我遇到的問題是:當完成一個番茄鐘后,需要對統(tǒng)計數(shù)據(jù)進行刷新,但是重新調(diào)用一下畫圖函數(shù)無效,下面貼出調(diào)用的這個畫圖函數(shù):
class MyFigure(FigureCanvas, QWidget): def __init__(self,parent=None, minWidth=600, minHeight=380, dpi=120): #第一步:創(chuàng)建一個創(chuàng)建Figure self.fig = Figure(figsize=(8, 8), dpi=dpi) #第二步:在父類中**Figure窗口 super(MyFigure,self).__init__(self.fig) #此句必不可少,否則不能顯示圖形 #第三步:創(chuàng)建一個子圖,用于繪制圖形用,111表示子圖編號,如matlab的subplot(1,1,1) self.axes = self.fig.add_subplot(111) self.setMinimumSize(minWidth, minHeight) FigureCanvas.updateGeometry(self) #第四步:就是畫圖,【可以在此類中畫,也可以在其它類中畫】 #畫日分布圖 def drawDayChart(self): periodHour=['0'+str(i) if i10 else str(i) for i in range(24)] periodDict=dict(zip(periodHour, [0]*24)) with open('configFiles/history.txt', 'r') as f: lines=f.readlines() for line in lines: period=line[11:13] periodDict[period]+=1 periodDictKeys=periodDict.keys() periodDictValues=periodDict.values() rects=self.axes.bar(periodDictKeys, periodDictValues, align='edge', width=0.9, color='green') self.axes.set_ylabel('番茄鐘個數(shù)') self.axes.set_title('番茄鐘日分布', color='blue') for rect in rects: x=rect.get_x() y=rect.get_height() if(y==0): continue self.axes.text(x, 1.01*y, str(y), va='bottom')
1、首先確定每次刷新的時候,穿給圖標的數(shù)據(jù)是否真正刷新,確定這一點后
2、嘗試使用self.axes.clear()將之前畫的圖刪除掉,然后重畫---嘗試后仍然不行
3、google :How to update a plot in matplotlib?
找到了這么幾行代碼:
fig.canvas.draw() fig.canvas.flush_events()
于是去matplotlib官網(wǎng)查文檔,在我的函數(shù)中加入了self.fig.canvas.draw_idle()。
4、成功實現(xiàn)了刷新
最后的代碼:
class MyFigure(FigureCanvas, QWidget): def __init__(self,parent=None, minWidth=600, minHeight=380, dpi=120): #第一步:創(chuàng)建一個創(chuàng)建Figure self.fig = Figure(figsize=(8, 8), dpi=dpi) #第二步:在父類中**Figure窗口 super(MyFigure,self).__init__(self.fig) #此句必不可少,否則不能顯示圖形 #第三步:創(chuàng)建一個子圖,用于繪制圖形用,111表示子圖編號,如matlab的subplot(1,1,1) self.axes = self.fig.add_subplot(111) self.setMinimumSize(minWidth, minHeight) FigureCanvas.updateGeometry(self) #第四步:就是畫圖,【可以在此類中畫,也可以在其它類中畫】 #畫日分布圖 def drawDayChart(self): periodHour=['0'+str(i) if i10 else str(i) for i in range(24)] periodDict=dict(zip(periodHour, [0]*24)) with open('configFiles/history.txt', 'r') as f: lines=f.readlines() for line in lines: period=line[11:13] periodDict[period]+=1 periodDictKeys=periodDict.keys() periodDictValues=periodDict.values() #實現(xiàn)刷新的條件1 self.axes.clear() rects=self.axes.bar(periodDictKeys, periodDictValues, align='edge', width=0.9, color='green') #實現(xiàn)刷新的條件2 self.fig.canvas.draw_idle() self.axes.set_ylabel('番茄鐘個數(shù)') self.axes.set_title('番茄鐘日分布', color='blue') for rect in rects: x=rect.get_x() y=rect.get_height() if(y==0): continue self.axes.text(x, 1.01*y, str(y), va='bottom')
即使清空了self.axes 但是畫布中可能還存在殘留數(shù)據(jù)
self.axes.fig.draw_idle()
在官方文檔中的描述是用于重畫圖表,因此嘗試使用,最終解決了問題!
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
標簽:西寧 石家莊 文山 懷化 浙江 昆明 梅州 錫林郭勒盟
巨人網(wǎng)絡(luò)通訊聲明:本文標題《PyQt5 matplotlib畫圖不刷新的解決方案》,本文關(guān)鍵詞 PyQt5,matplotlib,畫圖,不刷,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。