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正则表达式 re模块使用说明
May 19 Python
python实现简单socket程序在两台电脑之间传输消息的方法
Mar 13 Python
python查询sqlite数据表的方法
May 08 Python
详解设计模式中的工厂方法模式在Python程序中的运用
Mar 02 Python
python使用opencv读取图片的实例
Aug 17 Python
python爬虫之urllib库常用方法用法总结大全
Nov 14 Python
Python3.5局部变量与全局变量作用域实例分析
Apr 30 Python
通过python实现弹窗广告拦截过程详解
Jul 10 Python
python创建学生管理系统
Nov 22 Python
pytorch torchvision.ImageFolder的用法介绍
Feb 20 Python
Python实现迪杰斯特拉算法过程解析
Sep 18 Python
分析Python感知线程状态的解决方案之Event与信号量
Jun 16 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
使用PHP批量生成随机用户名
2008/07/10 PHP
php 函数使用方法与函数定义方法
2010/05/09 PHP
php简单提示框alert封装函数
2010/08/08 PHP
浅谈Laravel中的一个后期静态绑定
2017/08/11 PHP
js 点击按钮弹出另一页,选择值后,返回到当前页
2010/05/26 Javascript
js实现拉幕效果的广告代码
2015/09/02 Javascript
JS中作用域和变量提升(hoisting)的深入理解
2016/10/31 Javascript
js实现产品缩略图效果
2017/03/10 Javascript
vue-router 权限控制的示例代码
2017/09/21 Javascript
详解用Node.js写一个简单的命令行工具
2018/03/01 Javascript
webpack vue项目开发环境局域网访问方法
2018/03/20 Javascript
了解ESlint和其相关操作小结
2018/05/21 Javascript
基于Vue-cli快速搭建项目的完整步骤
2018/11/03 Javascript
angular6 填坑之sdk的方法
2018/12/27 Javascript
基于AngularJS拖拽插件ngDraggable.js实现拖拽排序功能
2019/04/02 Javascript
vue请求本地自己编写的json文件的方法
2019/04/25 Javascript
js遍历详解(forEach, map, for, for...in, for...of)
2019/08/28 Javascript
python控制台显示时钟的示例
2014/02/24 Python
简单讲解Python编程中namedtuple类的用法
2016/06/21 Python
对python的unittest架构公共参数token提取方法详解
2018/12/17 Python
python远程调用rpc模块xmlrpclib的方法
2019/01/11 Python
PyTorch和Keras计算模型参数的例子
2020/01/02 Python
python3.7通过thrift操作hbase的示例代码
2020/01/14 Python
TensorFlow dataset.shuffle、batch、repeat的使用详解
2020/01/21 Python
python 带时区的日期格式化操作
2020/10/23 Python
求职简历中自我评价
2014/01/28 职场文书
个人自荐材料
2014/05/23 职场文书
工程承包协议书范本
2014/09/29 职场文书
如何使用Python对NetCDF数据做空间相关分析
2021/04/21 Python
面试必问:圣杯布局和双飞翼布局的区别
2021/05/13 HTML / CSS
从np.random.normal()到正态分布的拟合操作
2021/06/02 Python
MybatisPlus代码生成器的使用方法详解
2021/06/13 Java/Android
python代码实现备忘录案例讲解
2021/07/26 Python
JavaScript展开运算符和剩余运算符的区别详解
2022/02/18 Javascript
Python下载商品数据并连接数据库且保存数据
2022/03/31 Python
React自定义hook的方法
2022/06/25 Javascript