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中用pycurl监控http响应时间脚本分享
Feb 02 Python
Python字典操作简明总结
Apr 13 Python
在Django框架中编写Contact表单的教程
Jul 17 Python
Python编程把二叉树打印成多行代码
Jan 04 Python
python通过tcp发送xml报文的方法
Dec 28 Python
python 实现视频流下载保存MP4的方法
Jan 09 Python
python pyinstaller 加载ui路径方法
Jun 10 Python
python selenium爬取斗鱼所有直播房间信息过程详解
Aug 09 Python
Python web如何在IIS发布应用过程解析
May 27 Python
解决keras加入lambda层时shape的问题
Jun 11 Python
Python3 用什么IDE开发工具比较好
Nov 28 Python
Pytest中skip和skipif的具体使用方法
Jun 30 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
桌面中心(一)创建数据库
2006/10/09 PHP
php 根据url自动生成缩略图并处理高并发问题
2014/01/23 PHP
Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能示例
2017/07/07 PHP
jquery 表单下所有元素的隐藏
2009/07/25 Javascript
JavaScript中instanceof运算符的用法总结
2013/11/19 Javascript
jQuery中bind()方法用法实例
2015/01/19 Javascript
jquery实现TAB选项卡鼠标经过带延迟效果的方法
2015/07/27 Javascript
关于js里的this关键字的理解
2015/08/17 Javascript
创建一般js对象的几种方式
2017/01/19 Javascript
jquery实现回车键触发事件(实例讲解)
2017/11/21 jQuery
vue页面加载闪烁问题的解决方法
2018/03/28 Javascript
百度小程序自定义通用toast组件
2019/07/17 Javascript
ES6 Object.assign()的用法及其使用
2020/01/18 Javascript
[02:42]2014DOTA2国际邀请赛 三冰专访:我会打到Ti20
2014/07/13 DOTA
[02:44]完美大师赛主赛事淘汰赛第二日观众采访
2017/11/24 DOTA
详解python之简单主机批量管理工具
2017/01/27 Python
简单了解Django模板的使用
2017/12/20 Python
浅析Python与Mongodb数据库之间的操作方法
2019/07/01 Python
python pip源配置,pip配置文件存放位置的方法
2019/07/12 Python
pandas如何处理缺失值
2019/07/31 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
2019/08/31 Python
python 常见的排序算法实现汇总
2020/08/21 Python
python的dict判断key是否存在的方法
2020/12/09 Python
关于 HTML5 的七个传说小结
2012/04/12 HTML / CSS
Bugatchi官方网站:男士服装在线
2019/04/10 全球购物
豪华床上用品 :Jennifer Adams
2019/09/15 全球购物
什么是三层交换,说说和路由的区别在那里
2014/09/01 面试题
民生工程实施方案
2014/03/22 职场文书
创建无烟单位实施方案
2014/03/29 职场文书
2014单位领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
预备党员自我批评思想汇报
2014/10/10 职场文书
致三级跳运动员加油稿
2015/07/21 职场文书
毕业感言怎么写
2015/07/31 职场文书
Python利用folium实现地图可视化
2021/05/23 Python
解决Swagger2返回map复杂结构不能解析的问题
2021/07/02 Java/Android
漫画「请问您今天要来点兔子吗?」最新杂志彩页公开
2022/03/24 日漫