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() 在官方文档中的描述是用于重画图表,因此尝试使用,最终解决了问题!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • Pyqt5 实现窗口缩放,控件在窗口内自动伸缩的操作

    在Qtdesigner中新建一个主界面如下所示: ctrl+R 预览 从预览图中可以看出这时的界面不支持伸缩,拖动过小的话会导致部分界面遮住不可见,这时我们就要用到布局选项,首先对上面的按钮和文本框布局按住ctrl选中要布局的控件 根据实际情况选中工具栏上的布局按钮,我这里是网格布局 选中后如下所示 然后在对底下的listwidget和tablewidget进行水平布局,布局完成后如下所示,其中有个细节是还要对Qgroupbox在进行一次水平或垂直布局,具体是选中Qgroupbox控件然后点击水

  • PyQt5中QSpinBox计数器的实现

    QSpinBox 是一个计数器控件,允许用户选择一个整数值,通过单击向上/向下按钮或按键盘上的上/下箭头来增加/减少当前显示的值,当然用户也可以输入值.在默认情况下,QSpinBox 的取值范围是 0-99,每次改变的步长值为 1. QSpinBox 类和 QDoubleSpinBox 类均派生自 QAbstractSpinBox 类.QSpinBox 用于处理整数值,QDoubleSpinBox 则用于处理浮点值,它们之间的区别就是处理数据的类型不同,其他功能都基本相同.QDoubleSpin

  • PyQt5通过信号实现MVC的示例

    众所周知MVC是个好东西.前阵子网上搜了下,但关于用PyQt5实现MVC的中文文档缺少之又少,优质的文档只搜到了一篇.既然这样,来,开个坑,学习新知识,吸引流量.话说,关于PyQt5,布局那里需要好好看看,容器类控件需要好好看看,还有多线程和自动化测试那块.但要写出完美GUI需要大量的代码经验和文档查询的能力.然后,嗯,这部分坑就填完了. 扯回正题:假设此时面临的场景是,一个软件涉及好几个页面,每个页面是单独的代码.且每个页面需要有自己的controller,最终所有的controller汇总到

  • PyQt5 实现给无边框widget窗口添加背景图片

    我就废话不多说了,大家还是直接看代码吧~ #! /usr/bin/env python # -*- coding:utf-8 -*- import sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtCore import Qt from PyQt5.QtGui import QPalette, QBrush, QPixmap class NoBorderWindow(QWidget): def __init__(

  • 解决PyQt5 无边框后窗口的移动问题

    由于隐藏了标题栏无法通过点击标题栏来实现窗口的移动,这时候我们可以通过鼠标事件来移动窗口 第一步:判断鼠标左键是否被按下,如果按下则将flag设为True并获取当前的位置 第二步:判断鼠标是否移动并且左键被按下,若移动了计算移动的距离在移动窗口 第三步:若鼠标释放了则将flag设为False 具体做法:重写窗口类自带的三个函数 def mousePressEvent(self, event): if event.button()==Qt.LeftButton: self.m_flag=True

  • PyQt5 设置窗口全屏显示方式

    调用窗口的主程序如下 起作用的是window.showFullScreen()这个方法. if __name__=='__main__': app = QtWidgets.QApplication(sys.argv) window = MyMainWindow() window.showFullScreen() sys.exit(app.exec_()) 补充:PYQT5的UI界面自适应窗口大小 | Qtdesigner PYQT5设置自适应的窗口大小 目前网上的相关博客的介绍都太过于表面,本人

  • pyqt5 设置窗体透明控件不透明的操作

    我就废话不多说了,大家还是直接看代码吧~ // 窗体透明,控件不透明 self.setWindowFlags(Qt.FramelessWindowHint | Qt.Tool) self.setAttribute(Qt.WA_TranslucentBackground) 补充:[解决问题]pyqt5设置窗体透明,而上面的控件不透明 在做软件的时候想把QWidget设置成透明的,我在网上搜了各种答案: 有说设置qss背景属性的:background: transparent; 但是这样就全透明了.

  • PyQt5 matplotlib画图不刷新的解决方案

    本人最近在做一个GUI项目时,需要用到matplotlib画图,写完代码运行时,发现所需要画图功能不能正常使用,在触发画图事件后,画布未更新,需要放大界面才能更新(奇葩吧). 经过资料查阅,发现需要画图函数后面添加 self.fig.canvas.draw_idle() 补充:解决PyQt5中使用柱状图和饼状图刷新问题 一.问题描述 在做一款番茄钟应用,其中包含数据统计功能,如下图: 我遇到的问题是:当完成一个番茄钟后,需要对统计数据进行刷新,但是重新调用一下画图函数无效,下面贴出调用的这个画图

  • 解决Linux系统中python matplotlib画图的中文显示问题

    最近想学习一些python数据分析的内容,就弄了个爬虫爬取了一些数据,并打算用Anaconda一套的工具(pandas, numpy, scipy, matplotlib, jupyter)等进行一些初步的数据挖掘和分析. 在使用matplotlib画图时,横坐标为中文,但是画出的条形图横坐标总是显示"框框",就去查资料解决.感觉这应该是个比较常见的问题,网上的中文资料也确实很多,但是没有任何一个彻底解决了我遇到的问题.零零碎碎用了快3个小时的时间,才终于搞定.特此分享,希望能帮到有同

  • 基于Linux系统中python matplotlib画图的中文显示问题的解决方法

    最近想学习一些python数据分析的内容,就弄了个爬虫爬取了一些数据,并打算用Anaconda一套的工具(pandas, numpy, scipy, matplotlib, jupyter)等进行一些初步的数据挖掘和分析. 在使用matplotlib画图时,横坐标为中文,但是画出的条形图横坐标总是显示"框框",就去查资料解决.感觉这应该是个比较常见的问题,网上的中文资料也确实很多,但是没有任何一个彻底解决了我遇到的问题.零零碎碎用了快3个小时的时间,才终于搞定.特此分享,希望能帮到有同

  • 利用PyQt5+Matplotlib 绘制静态/动态图的实现代码

    代码编辑环境 Win10+(Pycharmm or Vscode)+PyQt 5.14.2 功能实现 静态作图:数据作图,取决于作图函数,可自行修改 动态作图:产生数据,获取并更新数据,最后刷新显示,可用于实现数据实时采集并显示的场景 效果展示 代码块(业务与逻辑分离)业务–UI界面代码 文件名:Ui_realtimer_plot.py # -*- coding: utf-8 -*- # Added by the Blog author VERtiCaL on 2020/07/12 at SSR

  • python matplotlib画图时坐标轴重叠显示不全和图片保存时不完整的问题解决

    目录 问题 解决方案 保存时图片不完整的问题 补充:使用matplotlib时如何让坐标轴完整显示所有的标签刻度 总结 问题 在使用matplotlib作图的时候,有的时候会遇到画图时坐标轴重叠,显示不全和图片保存时不完整的问题.如下: 解决方案 画图时重叠或者显示不全的问题 画图时加上参数设置tight_layout=True 画完所有子图后,设置plt.tight_layout() # 加上tight_layout=True 参数设置 fig, axes = plt.subplots(nro

  • python matplotlib画图实例代码分享

    python的matplotlib包支持我们画图,有点非常多,现学习如下. 首先要导入包,在以后的示例中默认已经导入这两个包 import matplotlib.pyplot as plt import numpy as np 然后画一个最基本的图 t = np.arange(0.0, 2.0, 0.01)#x轴上的点,0到2之间以0.01为间隔 s = np.sin(2*np.pi*t)#y轴为正弦 plt.plot(t, s)#画图 plt.xlabel('time (s)')#x轴标签 p

  • Python matplotlib画图实例之绘制拥有彩条的图表

    生产定制一个彩条标签. 首先导入: import matplotlib.pyplot as plt import numpy as np from matplotlib import cm from numpy.random import randn 制作拥有垂直(默认)彩条的图表: fig, ax = plt.subplots() data = np.clip(randn(250, 250), -1, 1) cax = ax.imshow(data, interpolation='neares

  • layui点击按钮页面会自动刷新的解决方案

    问题: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" rel="external no

  • 使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法

    如下所示: # coding=utf-8 import pandas as pd # 读取csv文件 3列取名为 name,sex,births,后面参数格式为names= names1880 = pd.read_csv("names_1880.txt", names=['name', 'sex', 'births']) print names1880 print names1880.groupby('sex').births.sum() 输出如下 最后一行是说按sex分组并计算bir

  • Python matplotlib 画图窗口显示到gui或者控制台的实例

    我们再用Jupyter-notebook,ipython-console,qtconsole的时候,有的时候画图希望不弹出窗口,直接画在console里,又得时候有希望弹出窗口,因为console里太小了 那么我们可以用下面的命令 %matplotlib inline 然后在控制台里画图就可以显示在控制台里 %matplotlib qt5 #备选参数: ['auto', 'gtk', 'gtk3', 'inline', 'nbagg', 'notebook', 'osx', 'qt', 'qt4

随机推荐