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中实现常量(Const)功能
Jan 28 Python
python 捕获 shell/bash 脚本的输出结果实例
Jan 04 Python
Python中关于Sequence切片的下标问题详解
Jun 15 Python
Python AES加密实例解析
Jan 18 Python
Python中修改字符串的四种方法
Nov 02 Python
Python搭建Spark分布式集群环境
Jul 05 Python
pywinauto自动化操作记事本
Aug 26 Python
python3中rank函数的用法
Nov 27 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
Jan 05 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
Apr 08 Python
通俗易懂了解Python装饰器原理
Sep 17 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
Jan 28 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实现MD5加密16位(不要默认的32位)
2013/08/12 PHP
ThinkPHP6.0如何利用自定义验证规则规范的实现登陆
2020/12/16 PHP
JS获取scrollHeight问题想到的标准问题
2007/05/27 Javascript
javascript判断ie浏览器6/7版本加载不同样式表的实现代码
2011/12/26 Javascript
javascript中的=等号个数问题两个跟三个有什么区别
2013/10/23 Javascript
jquery实现简洁文件上传表单样式
2015/11/02 Javascript
jQuery动态添加及删除表单上传元素的方法(附demo源码下载)
2016/01/15 Javascript
JavaScript代码实现左右上下自动晃动自动移动
2016/04/08 Javascript
JS提示:Uncaught SyntaxError: Unexpected token ILLEGAL错误的解决方法
2016/08/19 Javascript
JS常见构造模式实例对比分析
2018/08/27 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
2018/08/29 Javascript
Vuex mutitons和actions初使用详解
2019/03/04 Javascript
解决vue组件中click事件失效的问题
2019/11/09 Javascript
uni-app如何实现增量更新功能
2020/01/03 Javascript
从0到1学习JavaScript编写贪吃蛇游戏
2020/07/28 Javascript
python中查看变量内存地址的方法
2015/05/05 Python
简单解决Python文件中文编码问题
2015/11/22 Python
Python文件操作之合并文本文件内容示例代码
2017/09/19 Python
Python搜索引擎实现原理和方法
2017/11/27 Python
Python实现的tcp端口检测操作示例
2018/07/24 Python
解决python ThreadPoolExecutor 线程池中的异常捕获问题
2020/04/08 Python
Python 字符串池化的前提
2020/07/03 Python
关于webview适配H5上传照片或者视频文件的方法
2020/11/04 HTML / CSS
Sneaker Studio匈牙利:购买运动鞋
2018/03/26 全球购物
使用索引有什么好处
2016/07/27 面试题
销售文员的岗位职责
2013/11/20 职场文书
小学岗位竞聘方案
2014/01/22 职场文书
商铺消防安全责任书
2014/07/29 职场文书
2014年个人委托书范本
2014/10/13 职场文书
群众路线个人整改方案
2014/10/25 职场文书
家长会后的感想
2015/08/11 职场文书
SSM项目使用拦截器实现登录验证功能
2022/01/22 Java/Android
Java处理延时任务的常用几种解决方案
2022/06/01 Java/Android
Nginx代理Redis哨兵主从配置的实现
2022/07/15 Servers
详解CSS中postion和opacity及cursor的特性
2022/08/14 HTML / CSS