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实现简单ftp客户端的方法
Jun 28 Python
Python的string模块中的Template类字符串模板用法
Jun 27 Python
使用Python的toolz库开始函数式编程的方法
Nov 15 Python
Django框架实现的简单分页功能示例
Dec 04 Python
python opencv对图像进行旋转且不裁剪图片的实现方法
Jul 09 Python
python自带tkinter库实现棋盘覆盖图形界面
Jul 17 Python
django中使用Celery 布式任务队列过程详解
Jul 29 Python
Django实现WebSSH操作物理机或虚拟机的方法
Nov 06 Python
Python嵌套函数,作用域与偏函数用法实例分析
Dec 26 Python
python实现连连看游戏
Feb 14 Python
找Python安装目录,设置环境路径以及在命令行运行python脚本实例
Mar 09 Python
Python基础之元组与文件知识总结
May 19 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导出oracle库的php代码
2009/04/20 PHP
Sublime里直接运行PHP配置方法
2014/11/28 PHP
PHP远程调试之XDEBUG
2015/12/29 PHP
PHP论坛实现积分系统的思路代码详解
2020/06/01 PHP
图片按比例缩放函数
2006/06/26 Javascript
js用图作提交按钮或超连接
2008/03/26 Javascript
javascript的trim,ltrim,rtrim自定义函数
2008/09/21 Javascript
JavaScript加强之自定义event事件
2013/09/21 Javascript
浅析jquery的js图表组件highcharts
2014/03/06 Javascript
javascript的propertyIsEnumerable()方法使用介绍
2014/04/09 Javascript
JavaScript常用的弹出广告及背投广告实现方法
2015/02/06 Javascript
基于jQuery Circlr插件实现产品图片360度旋转
2015/09/20 Javascript
跟我学习javascript的异步脚本加载
2015/11/20 Javascript
一个超简单的jQuery回调函数例子(分享)
2016/08/08 Javascript
JS中showModalDialog关闭子窗口刷新主窗口用法详解
2017/03/25 Javascript
vue中实现移动端的scroll滚动方法
2018/03/03 Javascript
NodeJS读取分析Nginx错误日志的方法
2019/05/14 NodeJs
nuxt框架中对vuex进行模块化设置的实现方法
2019/09/06 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
2019/09/10 Javascript
JavaScript数组常用的增删改查与其他属性详解
2020/10/13 Javascript
Python中集合类型(set)学习小结
2015/01/28 Python
Python解析json文件相关知识学习
2016/03/01 Python
python使用arcpy.mapping模块批量出图
2017/03/06 Python
Python实现上下班抢个顺风单脚本
2018/02/07 Python
python垃圾回收机制(GC)原理解析
2019/12/30 Python
Radley英国官网:英国莱德利小狗包
2019/03/21 全球购物
北美女性服装零售连锁店:maurices
2019/06/12 全球购物
幼儿教师研修感言
2014/02/12 职场文书
会计求职信范文
2014/05/24 职场文书
公司副总经理岗位职责
2014/10/01 职场文书
学校法制宣传日活动总结
2014/11/01 职场文书
2017寒假社会实践心得体会范文
2016/01/14 职场文书
电工生产实习心得体会
2016/01/22 职场文书
2019通用版新员工入职培训方案!
2019/07/11 职场文书
2019年大学生暑期社会实践调查报告模板
2019/11/07 职场文书
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技