PyQt5 matplotlib畫(huà)圖不刷新的解決方案
本人最近在做一個(gè)GUI項(xiàng)目時(shí),需要用到matplotlib畫(huà)圖,寫(xiě)完代碼運(yùn)行時(shí),發(fā)現(xiàn)所需要畫(huà)圖功能不能正常使用,在觸發(fā)畫(huà)圖事件后,畫(huà)布未更新,需要放大界面才能更新(奇葩吧)。
經(jīng)過(guò)資料查閱,發(fā)現(xiàn)需要畫(huà)圖函數(shù)后面添加
self.fig.canvas.draw_idle()
補(bǔ)充:解決PyQt5中使用柱狀圖和餅狀圖刷新問(wèn)題
一、問(wèn)題描述
在做一款番茄鐘應(yīng)用,其中包含數(shù)據(jù)統(tǒng)計(jì)功能,如下圖:

我遇到的問(wèn)題是:當(dāng)完成一個(gè)番茄鐘后,需要對(duì)統(tǒng)計(jì)數(shù)據(jù)進(jìn)行刷新,但是重新調(diào)用一下畫(huà)圖函數(shù)無(wú)效,下面貼出調(diào)用的這個(gè)畫(huà)圖函數(shù):
class MyFigure(FigureCanvas, QWidget):
def __init__(self,parent=None, minWidth=600, minHeight=380, dpi=120):
#第一步:創(chuàng)建一個(gè)創(chuàng)建Figure
self.fig = Figure(figsize=(8, 8), dpi=dpi)
#第二步:在父類中**Figure窗口
super(MyFigure,self).__init__(self.fig) #此句必不可少,否則不能顯示圖形
#第三步:創(chuàng)建一個(gè)子圖,用于繪制圖形用,111表示子圖編號(hào),如matlab的subplot(1,1,1)
self.axes = self.fig.add_subplot(111)
self.setMinimumSize(minWidth, minHeight)
FigureCanvas.updateGeometry(self)
#第四步:就是畫(huà)圖,【可以在此類中畫(huà),也可以在其它類中畫(huà)】
#畫(huà)日分布圖
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('番茄鐘個(gè)數(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í)候,穿給圖標(biāo)的數(shù)據(jù)是否真正刷新,確定這一點(diǎn)后
2、嘗試使用self.axes.clear()將之前畫(huà)的圖刪除掉,然后重畫(huà)---嘗試后仍然不行
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、成功實(shí)現(xiàn)了刷新
最后的代碼:
class MyFigure(FigureCanvas, QWidget):
def __init__(self,parent=None, minWidth=600, minHeight=380, dpi=120):
#第一步:創(chuàng)建一個(gè)創(chuàng)建Figure
self.fig = Figure(figsize=(8, 8), dpi=dpi)
#第二步:在父類中**Figure窗口
super(MyFigure,self).__init__(self.fig) #此句必不可少,否則不能顯示圖形
#第三步:創(chuàng)建一個(gè)子圖,用于繪制圖形用,111表示子圖編號(hào),如matlab的subplot(1,1,1)
self.axes = self.fig.add_subplot(111)
self.setMinimumSize(minWidth, minHeight)
FigureCanvas.updateGeometry(self)
#第四步:就是畫(huà)圖,【可以在此類中畫(huà),也可以在其它類中畫(huà)】
#畫(huà)日分布圖
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()
#實(shí)現(xiàn)刷新的條件1
self.axes.clear()
rects=self.axes.bar(periodDictKeys, periodDictValues, align='edge', width=0.9, color='green')
#實(shí)現(xiàn)刷新的條件2
self.fig.canvas.draw_idle()
self.axes.set_ylabel('番茄鐘個(gè)數(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')
三、原因猜測(cè)
即使清空了self.axes 但是畫(huà)布中可能還存在殘留數(shù)據(jù)
self.axes.fig.draw_idle() 在官方文檔中的描述是用于重畫(huà)圖表,因此嘗試使用,最終解決了問(wèn)題!
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
- PyQt5結(jié)合matplotlib繪圖的實(shí)現(xiàn)示例
- 詳解pyqt5的UI中嵌入matplotlib圖形并實(shí)時(shí)刷新(挖坑和填坑)
- 利用PyQt5+Matplotlib 繪制靜態(tài)/動(dòng)態(tài)圖的實(shí)現(xiàn)代碼
- pyqt5與matplotlib的完美結(jié)合實(shí)例
- python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5滾動(dòng)條控件QScrollBar詳細(xì)使用方法與實(shí)例
- 在PYQT5中QscrollArea(滾動(dòng)條)的使用方法
- PyQt5實(shí)現(xiàn)將Matplotlib圖像嵌入到Scoll Area中顯示滾動(dòng)條效果
相關(guān)文章
Python基于pygame實(shí)現(xiàn)的font游戲字體(附源碼)
這篇文章主要介紹了Python基于pygame實(shí)現(xiàn)的font游戲字體,涉及Python響應(yīng)鍵盤(pán)按鍵動(dòng)態(tài)操作圖片元素的相關(guān)技巧,需要的朋友可以參考下2015-11-11
Pytorch的torch.utils.data中Dataset以及DataLoader示例詳解
torch.utils.data?是?PyTorch?提供的一個(gè)模塊,用于處理和加載數(shù)據(jù),該模塊提供了一系列工具類和函數(shù),用于創(chuàng)建、操作和批量加載數(shù)據(jù)集,這篇文章主要介紹了Pytorch的torch.utils.data中Dataset以及DataLoader等詳解,需要的朋友可以參考下2023-08-08
基于python3.7利用Motor來(lái)異步讀寫(xiě)Mongodb提高效率(推薦)
Motor是一個(gè)異步mongodb driver,支持異步讀寫(xiě)mongodb。它通常用在基于Tornado的異步web服務(wù)器中。這篇文章主要介紹了基于python3.7利用Motor來(lái)異步讀寫(xiě)Mongodb提高效率,需要的朋友可以參考下2020-04-04
Python基礎(chǔ)中所出現(xiàn)的異常報(bào)錯(cuò)總結(jié)
本篇文章介紹了Python基礎(chǔ)中所出現(xiàn)的異常報(bào)錯(cuò)總結(jié),這是Python日常所常見(jiàn)的錯(cuò)誤,現(xiàn)在總結(jié)出來(lái)給大家。2016-11-11
用Django實(shí)現(xiàn)一個(gè)可運(yùn)行的區(qū)塊鏈應(yīng)用
這篇文章主要介紹了用Django實(shí)現(xiàn)一個(gè)可運(yùn)行的區(qū)塊鏈應(yīng)用,需要的朋友可以參考下2018-03-03
python線程定時(shí)器Timer實(shí)現(xiàn)原理解析
這篇文章主要介紹了python線程定時(shí)器Timer實(shí)現(xiàn)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
python讀取并繪制nc數(shù)據(jù)的保姆級(jí)教程
其實(shí)目前很多數(shù)據(jù)以nc格式存儲(chǔ),這篇文章主要給大家介紹了關(guān)于python讀取并繪制nc數(shù)據(jù)的保姆級(jí)教程,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05

