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/


猜你喜欢
- 前言最近突然对爬虫有了一点兴趣,所以打算学一下爬虫,但是在安装使用一些库时,遇到了一些不小的麻烦,对于我来说,最麻烦的就是配置环境了,老是有
- 打包pyinstaller 02.py --noconsole --hidden-import PySide2.QtXml报错0:The &
- 主要就是了解一下pytorch中的使用layernorm这种归一化之后的数据变化,以及数据使用relu,prelu,leakyrelu之后的
- // 涉及命名空间 using System; using System.Collections; using System.Compone
- 五花八门的SQL产品多得要命,或许你早顾不得其它甩开袖子就动手干了。但你要同时采用ASP和SQL的话就可能会头晕。MySQL、SQL Ser
- 对于Mac上Homebrew安装的MySQL,默认情况下只能使用本地登录。而使用其它主机远程登录Mac上的MySQL则会被拒绝访问。下面修改
- 一 导入 pymongofrom pymongo import MongoClient二 连接服务器 端口号 27017连接MongoDB连
- 一、假设有这样一个原始dataframe二、提取索引(已经做了一些操作将Age为NaN的行提取出来并合并为一个dataframe,这里提取的
- 前言return语句用于退出函数,向调用方返回一个表达式。return在不带参数的情况下(或者没有写return语句),默认返回None。N
- 过拟合问题实战1.构建数据集我们使用的数据集样本特性向量长度为 2,标签为 0 或 1,分别代表了 2 种类别。借助于 scikit-lea
- 全局变量与局部变量# num1是全局变量num1 = 1# num2是局部变量def func():num2 = 2在函数外(且不在函数里)
- 系统支持的语言是有类:Language表示;多语言资源对应的类为:LocalizedProperty;当先选择某种语言存储在类中:Gener
- 写在前面:这篇文章也是借鉴了一些前辈的代码和思路写的,代码有些也是复用了别人的。先说下思路:1.首先利用Opencv检测出人脸的区域&nbs
- str='python String function'生成字符串变量str='python String func
- 如何准确地获得一个整数?当然可以,Format就是做这个的“专家”:function NumbersOnlyNoDecimals(
- 最新在学习 Python,PyCharm 编辑器启动太慢奈何我电脑太烂,所以我选择使用 Sublime Text3 做为编辑器不过 Subl
- 模块的的作用主要是用于字符串和文本处理,查找,搜索,替换等复习一下基本的正则表达式吧 .:匹配除了换行符以为的任意单个字符&nbs
- JavaScript游戏开发之键盘控制层的移动截图:<html> <head> <meta http-equi
- 年关将至,大家对疫情的关注度也愈发提升,本次使用PyQt5撰写100行代码写一个疫情信息快速查看工具。一.准备工作1.PyQt5PyQt 是
- 设计图是这样:可是做出来是这样:出现了一行连着。。要知道工作上总有些ui没事做喜欢指指点点。后来翻查官方手册发现了这个参数:附上网址:htt