matplotlib实现数据实时刷新的示例代码


Posted in Python onJanuary 05, 2021

前言

matplotlib是python下非常好用的一个数据可视化套件,网上相关的教程也非常丰富,使用方便。本人需求一个根据实时数据刷新曲线的上位机软件,找了半天,基本上都是使用matplotlib的交互模式,我折腾半天还是没有实现想要的效果,但却通过另一种方法实现了想要的效果。

matplotlib实现数据实时刷新的示例代码

源码

注释已经很充分,不多赘述,直接看源码。

import matplotlib.pyplot as plt
import numpy as np
import threading
import sys
from random import random, randrange
from time import sleep

'''
绘制2x2的画板
可设置窗口标题和4个子图标题
可更新曲线数据
'''
quit_flag = False # 退出标志


class Plot2_2(object):
  """ 2x2的画板 """

  def __init__(self, wtitle='Figure', p1title='1', p2title='2', p3title='3',
         p4title='4'):
    self.sub_title = [p1title, p2title, p3title, p4title] # 4个子图的标题
    self.fig, self.ax = plt.subplots(2, 2) # 创建2X2子图
    self.fig.subplots_adjust(wspace=0.3, hspace=0.3) # 设置子图之间的间距
    self.fig.canvas.set_window_title(wtitle) # 设置窗口标题

    # 子图字典,key为子图的序号,value为子图句柄
    self.axdict = {0: self.ax[0, 0], 1: self.ax[0, 1], 2: self.ax[1, 0], 3: self.ax[1, 1]}

  def showPlot(self):
    """ 显示曲线 """
    plt.show()

  def setPlotStyle(self, index):
    """ 设置子图的样式,这里仅设置了标题 """
    self.axdict[index].set_title(self.sub_title[index], fontsize=12)

  def updatePlot(self, index, x, y):
    """
    更新指定序号的子图
    :param index: 子图序号
    :param x: 横轴数据
    :param y: 纵轴数据
    :return:
    """
    # X轴数据必须和Y轴数据长度一致
    if len(x) != len(y):
      ex = ValueError("x and y must have same first dimension")
      raise ex

    self.axdict[index].cla() # 清空子图数据
    self.axdict[index].plot(x, y) # 绘制最新的数据
    self.setPlotStyle(index) # 设置子图样式
    if min(x) < max(x):
      self.axdict[index].set_xlim(min(x), max(x)) # 根据X轴数据区间调整X轴范围
    plt.draw()
    print("%s end" % sys._getframe().f_code.co_name)


def updatePlot(plot):
  """
  模拟收到实时数据,更新曲线的操作
  :param plot: 曲线实例
  :return:
  """
  print("Thread: %s" % threading.current_thread().getName())
  count = 0
  global quit_flag
  print("quit_flag[%s]" % str(quit_flag))
  while True:
    if quit_flag:
      print("quit_flag[%s]" % str(quit_flag))
      break
    count += 1
    print("count#%d" % count)
    x = np.arange(0, 100, 1)
    y = np.random.normal(loc=1, scale=1, size=100) # 产生随机数,模拟变化的曲线
    index = randrange(4) # 随机更新某一个子图
    plot.updatePlot(index, x, y)
    sleep(random() * 3)


def main():
  p = Plot2_2() # 创建一个2X2画板

  t = threading.Thread(target=updatePlot, args=(p,)) # 启动一个线程更新曲线数据
  t.start()

  p.showPlot() # showPlot方法会阻塞当前线程,直到窗口关闭
  print("plot close")
  global quit_flag
  quit_flag = True # 通知更新曲线数据的线程退出

  t.join()
  print("Thread: %s end" % threading.current_thread().getName())


if __name__ == '__main__':
  main()

结语

上述方法初步实现了根据实时数据刷新曲线的效果,目前测试发现偶尔程序无法完全退出,还有待改进。到此这篇关于matplotlib实现数据实时刷新的示例代码的文章就介绍到这了,更多相关matplotlib 数据实时刷新内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python通过函数属性实现全局变量的方法
May 16 Python
Flask框架的学习指南之用户登录管理
Nov 20 Python
Python实现的概率分布运算操作示例
Aug 14 Python
对Python3中bytes和HexStr之间的转换详解
Dec 04 Python
python实现简单日期工具类
Apr 24 Python
python实现点击按钮修改数据的方法
Jul 17 Python
基于Python函数和变量名解析
Jul 19 Python
Python爬虫学习之翻译小程序
Jul 30 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
Dec 18 Python
Python Django搭建文件下载服务器的实现
May 10 Python
Python获取江苏疫情实时数据及爬虫分析
Aug 02 Python
5个pandas调用函数的方法让数据处理更加灵活自如
Apr 24 Python
Matplotlib配色之Colormap详解
Jan 05 #Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
Jan 05 #Python
python实现文件+参数发送request的实例代码
Jan 05 #Python
为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景
Jan 05 #Python
Matplotlib中rcParams使用方法
Jan 05 #Python
matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)
Jan 05 #Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
Jan 05 #Python
You might like
FCKeditor的安装(PHP)
2007/01/13 PHP
防止MySQL注入或HTML表单滥用的PHP程序
2009/01/21 PHP
PHP+JS+rsa数据加密传输实现代码
2011/03/23 PHP
防止网站内容被拷贝的一些方法与优缺点好处与坏处分析
2007/11/30 Javascript
Firebug 字幕文件JSON地址获取代码
2009/10/28 Javascript
基于jQuery的获取标签名的代码
2012/07/16 Javascript
jquery获取特定name所有选中的checkbox,支持IE9标准模式
2013/03/18 Javascript
AngularJS入门教程之Hello World!
2014/12/06 Javascript
js实现从中间开始往上下展开网页窗口的方法
2015/03/02 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
AngularJS 中的Promise --- $q服务详解
2016/09/14 Javascript
javaScript中定义类或对象的五种方式总结
2016/12/04 Javascript
js中常用的Math方法总结
2017/01/12 Javascript
公众号SVG动画交互实战代码
2020/05/31 Javascript
[15:07]lgd_OG_m2_BP
2019/09/10 DOTA
用Python代码来绘制彭罗斯点阵的教程
2015/04/03 Python
python通过邮件服务器端口发送邮件的方法
2015/04/30 Python
Python解析nginx日志文件
2015/05/11 Python
Python的多态性实例分析
2015/07/07 Python
python虚拟环境virtualenv的安装与使用
2017/09/21 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
2018/04/28 Python
解决PyCharm的Python.exe已经停止工作的问题
2018/11/29 Python
详解window.open被浏览器拦截的解决方案
2019/07/18 HTML / CSS
Sofmap官网:日本著名的数码电器专卖店
2017/05/19 全球购物
外国语学院毕业生自荐信
2013/10/28 职场文书
三方协议书范本
2014/04/22 职场文书
小班下学期评语
2014/05/04 职场文书
个人剖析材料及整改措施
2014/10/07 职场文书
普通党员个人剖析材料
2014/10/08 职场文书
2014年质检员工作总结
2014/11/18 职场文书
写给同学的新学期寄语
2015/02/27 职场文书
六五普法学习心得体会
2016/01/21 职场文书
关于公司年会的开幕词
2016/03/04 职场文书
Java中CyclicBarrier和CountDownLatch的用法与区别
2021/08/23 Java/Android
详细聊聊浏览器是如何看闭包的
2021/11/11 Javascript
详解在SQLPlus中实现上下键翻查历史命令的功能
2022/03/18 SQL Server