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 获取本机ip地址的两个方法
Feb 25 Python
python 将字符串转换成字典dict
Mar 24 Python
Python和GO语言实现的消息摘要算法示例
Mar 10 Python
python获取当前用户的主目录路径方法(推荐)
Jan 12 Python
Python排序搜索基本算法之希尔排序实例分析
Dec 09 Python
Python使用matplotlib实现绘制自定义图形功能示例
Jan 18 Python
Window10+Python3.5安装opencv的教程推荐
Apr 02 Python
Python文件监听工具pyinotify与watchdog实例
Oct 15 Python
Python二叉树的镜像转换实现方法示例
Mar 06 Python
Python占用的内存优化教程
Jul 28 Python
python的slice notation的特殊用法详解
Dec 27 Python
python基于机器学习预测股票交易信号
May 25 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
全国FM电台频率大全 - 5 内蒙古自治区
2020/03/11 无线电
php生成随机数/生成随机字符串的方法小结【5种方法】
2020/05/27 PHP
强悍无比的WEB开发好助手FireBug(Firefox Plugin)
2007/01/16 Javascript
js获得鼠标的坐标值的方法
2013/03/13 Javascript
jQuery设置div一直在页面顶部显示的方法
2013/10/24 Javascript
变量声明时命名与变量作为对象属性时命名的区别解析
2013/12/06 Javascript
JQuery给元素绑定click事件多次执行的解决方法
2014/05/29 Javascript
仿淘宝TAB切换搜索框搜索切换的相关内容
2014/09/21 Javascript
JQuery中DOM事件合成用法实例分析
2015/06/13 Javascript
JS三级可折叠菜单实现方法
2016/02/29 Javascript
AngularJs页面筛选标签小功能
2016/08/01 Javascript
浅谈js for循环输出i为同一值的问题
2017/03/01 Javascript
JS字符串长度判断,超出进行自动截取的实例(支持中文)
2017/03/06 Javascript
Angular4学习之Angular CLI的安装与使用教程
2018/01/04 Javascript
分享ES6的7个实用技巧
2018/01/18 Javascript
利用js给datalist或select动态添加option选项的方法
2018/01/25 Javascript
sortable+element 实现表格行拖拽的方法示例
2019/06/07 Javascript
vue+element-ui+axios实现图片上传
2019/08/20 Javascript
JS实现打字游戏
2019/12/17 Javascript
js实现拾色器插件(ColorPicker)
2020/05/21 Javascript
Linux(Redhat)安装python3.6虚拟环境(推荐)
2018/05/05 Python
python hough变换检测直线的实现方法
2019/07/12 Python
用python写测试数据文件过程解析
2019/09/25 Python
Python如何设置指定窗口为前台活动窗口
2020/08/12 Python
真正了解CSS3背景下的@font face规则
2017/05/04 HTML / CSS
全球地下的服装和态度:Slam Jam
2018/02/04 全球购物
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
Oracle快照(snapshot)
2015/03/13 面试题
优纳科技软件测试面试题
2012/05/15 面试题
关于运动会的广播稿(10篇)
2014/09/12 职场文书
考研复习计划
2015/01/19 职场文书
2015年反洗钱工作总结
2015/04/25 职场文书
2015年酒店年度工作总结
2015/05/23 职场文书
2016年社区文体活动总结
2016/04/06 职场文书
为什么代码规范要求SQL语句不要过多的join
2021/06/23 MySQL
Python写情书? 10行代码展示如何把情书写在她的照片里
2022/04/21 Python