PyQt5 matplotlib画图不刷新的解决方案
作者:程序员大本营 发布时间:2021-06-14 14:43:39
标签:PyQt5,matplotlib,画图
本人最近在做一个GUI项目时,需要用到matplotlib画图,写完代码运行时,发现所需要画图功能不能正常使用,在触发画图事件后,画布未更新,需要放大界面才能更新(奇葩吧)。
经过资料查阅,发现需要画图函数后面添加
self.fig.canvas.draw_idle()
补充:解决PyQt5中使用柱状图和饼状图刷新问题
一、问题描述
在做一款番茄钟应用,其中包含数据统计功能,如下图:
我遇到的问题是:当完成一个番茄钟后,需要对统计数据进行刷新,但是重新调用一下画图函数无效,下面贴出调用的这个画图函数:
class MyFigure(FigureCanvas, QWidget):
def __init__(self,parent=None, minWidth=600, minHeight=380, dpi=120):
#第一步:创建一个创建Figure
self.fig = Figure(figsize=(8, 8), dpi=dpi)
#第二步:在父类中**Figure窗口
super(MyFigure,self).__init__(self.fig) #此句必不可少,否则不能显示图形
#第三步:创建一个子图,用于绘制图形用,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('番茄钟个数')
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、首先确定每次刷新的时候,穿给图标的数据是否真正刷新,确定这一点后
2、尝试使用self.axes.clear()将之前画的图删除掉,然后重画---尝试后仍然不行
3、google :How to update a plot in matplotlib?
找到了这么几行代码:
fig.canvas.draw()
fig.canvas.flush_events()
于是去matplotlib官网查文档,在我的函数中加入了self.fig.canvas.draw_idle()。
4、成功实现了刷新
最后的代码:
class MyFigure(FigureCanvas, QWidget):
def __init__(self,parent=None, minWidth=600, minHeight=380, dpi=120):
#第一步:创建一个创建Figure
self.fig = Figure(figsize=(8, 8), dpi=dpi)
#第二步:在父类中**Figure窗口
super(MyFigure,self).__init__(self.fig) #此句必不可少,否则不能显示图形
#第三步:创建一个子图,用于绘制图形用,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()
#实现刷新的条件1
self.axes.clear()
rects=self.axes.bar(periodDictKeys, periodDictValues, align='edge', width=0.9, color='green')
#实现刷新的条件2
self.fig.canvas.draw_idle()
self.axes.set_ylabel('番茄钟个数')
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 但是画布中可能还存在残留数据
self.axes.fig.draw_idle()
在官方文档中的描述是用于重画图表,因此尝试使用,最终解决了问题!
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。
来源:https://www.pianshen.com/article/2516157053/
0
投稿
猜你喜欢
- 人工神经网络的许多算法已在智能信息处理系统中获得广泛采用,尤为突出是是以下4种算法:ART网络、LVQ网络、Kohonen网络Hopfiel
- import httplibimport osimport timedef check_http(i):
- 进入PyCharm后,点击File→Open,然后在弹窗中选择需要导入项目的文件夹;打开了python项目后,需要配置该项目对应的pytho
- 一、为何人工智能(AI)首选Python?读完这篇文章你就知道了。我们看谷歌的TensorFlow基本上所有的代码都是C++和Python,
- 通过一条命令用Npm安装gulp-htmlmin:npm install gulp-htmlmin --save-dev安装完毕后,打开gu
- 本文实例讲述了Python常见MongoDB数据库操作。分享给大家供大家参考,具体如下:MongoDB 是一个基于分布式文件存储的数据库。由
- 分页查询是经常能够遇到的问题,我们首先看看分页查询存在的理由:方便用户:用户不可能一次察看所有数据,所以一页一页的翻看比较好。提高性能:一次
- 因工作需要,要将存放在sql server数据库中的数据全部导入到mysql数据库中,在网上搜集相关资料,找到两种方法,现在分别谈谈对他们的
- 首先你要确定错误的原因: 让IE显示详细的出错信息: 菜单--工具--Internet选项--高级--显示友好的HTTP错误信息,去掉这个选
- 介绍matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图。而且也可以方
- 如下所示:data_array = np.loadtxt(filename, #文件名  
- 1、吃金币源码分享:import osimport cfgimport sysimport pygameimport randomfrom
- 本文实例讲述了Python3搜索及替换文件中文本的方法。分享给大家供大家参考。具体实现方法如下:# 将文件中的某个字符串改变成另一个 # 下
- 对会读书的人来说,读一本书要做的第一件事,就是仔细阅读这本书的目录。阅读目录可以对整体内容有所了解,并清楚地知道感兴趣的部分在哪里,提高阅读
- 以下代码实现了ip查询功能处理程序 import os,timedef getip(filepath):
- 现像如下:站点无法打开,或者打开很慢.HTML可以打开.重新启动或者回收应用程序池可恢复.但过一段时间又会出现日志里会有:ISAPI
- python模块中的__all__属性,可用于模块导入时限制,如:from module import *此时被导入模块若定义了__all_
- Gmail 作为一个经典的 Web 2.0 应用,在带来革命性的邮件管理体验的同时,以其完整、快速的 AJAX 操作方式,深受用户的推崇和技
- 导言Python官方文档对于内置函数的介绍较为简略,但这些内置函数在日常工作中却扮演着不可或缺的角色。为了更加便捷地使用和查阅这些函数,笔者
- 有过相关经验的朋友都知道,Jscript的效率毕竟有限,在数组中查找数据时如果用常规的算法来做执行起来会很慢。例如在一个含500个字符串的d