本人最近在做一個GUI項目時,需要用到matplotlib畫圖,寫完代碼運行時,發(fā)現(xiàn)所需要畫圖功能不能正常使用,在觸發(fā)畫圖事件后,畫布未更新,需要放大界面才能更新(奇葩吧)。
經(jīng)過資料查閱,發(fā)現(xiàn)需要畫圖函數(shù)后面添加
self.fig.canvas.draw_idle()
補充:解決PyQt5中使用柱狀圖和餅狀圖刷新問題
一、問題描述
在做一款番茄鐘應(yīng)用,其中包含數(shù)據(jù)統(tǒng)計功能,如下圖:
我遇到的問題是:當(dāng)完成一個番茄鐘后,需要對統(tǒng)計數(shù)據(jù)進(jìn)行刷新,但是重新調(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、首先確定每次刷新的時候,穿給圖標(biāo)的數(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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
您可能感興趣的文章:- PyQt5結(jié)合matplotlib繪圖的實現(xiàn)示例
- 詳解pyqt5的UI中嵌入matplotlib圖形并實時刷新(挖坑和填坑)
- 利用PyQt5+Matplotlib 繪制靜態(tài)/動態(tài)圖的實現(xiàn)代碼
- pyqt5與matplotlib的完美結(jié)合實例
- python GUI庫圖形界面開發(fā)之PyQt5滾動條控件QScrollBar詳細(xì)使用方法與實例
- 在PYQT5中QscrollArea(滾動條)的使用方法
- PyQt5實現(xiàn)將Matplotlib圖像嵌入到Scoll Area中顯示滾動條效果