PyQt5 matplotlib畫圖不刷新的解決方案
本人最近在做一個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ù)進行刷新,但是重新調(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 i<10 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 i<10 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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
Python基于pygame實現(xiàn)的font游戲字體(附源碼)
這篇文章主要介紹了Python基于pygame實現(xiàn)的font游戲字體,涉及Python響應(yīng)鍵盤按鍵動態(tài)操作圖片元素的相關(guān)技巧,需要的朋友可以參考下2015-11-11
Pytorch的torch.utils.data中Dataset以及DataLoader示例詳解
torch.utils.data?是?PyTorch?提供的一個模塊,用于處理和加載數(shù)據(jù),該模塊提供了一系列工具類和函數(shù),用于創(chuàng)建、操作和批量加載數(shù)據(jù)集,這篇文章主要介紹了Pytorch的torch.utils.data中Dataset以及DataLoader等詳解,需要的朋友可以參考下2023-08-08
基于python3.7利用Motor來異步讀寫Mongodb提高效率(推薦)
Motor是一個異步mongodb driver,支持異步讀寫mongodb。它通常用在基于Tornado的異步web服務(wù)器中。這篇文章主要介紹了基于python3.7利用Motor來異步讀寫Mongodb提高效率,需要的朋友可以參考下2020-04-04
Python基礎(chǔ)中所出現(xiàn)的異常報錯總結(jié)
本篇文章介紹了Python基礎(chǔ)中所出現(xiàn)的異常報錯總結(jié),這是Python日常所常見的錯誤,現(xiàn)在總結(jié)出來給大家。2016-11-11
用Django實現(xiàn)一個可運行的區(qū)塊鏈應(yīng)用
這篇文章主要介紹了用Django實現(xiàn)一個可運行的區(qū)塊鏈應(yīng)用,需要的朋友可以參考下2018-03-03
python讀取并繪制nc數(shù)據(jù)的保姆級教程
其實目前很多數(shù)據(jù)以nc格式存儲,這篇文章主要給大家介紹了關(guān)于python讀取并繪制nc數(shù)據(jù)的保姆級教程,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05

