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实现KNN分类算法
Dec 22 Python
Python基于pyCUDA实现GPU加速并行计算功能入门教程
Jun 19 Python
使用Python实现租车计费系统的两种方法
Sep 29 Python
python实现nao机器人手臂动作控制
Apr 29 Python
对pyqt5多线程正确的开启姿势详解
Jun 14 Python
python 串口读取+存储+输出处理实例
Dec 26 Python
python应用Axes3D绘图(批量梯度下降算法)
Mar 25 Python
150行Python代码实现带界面的数独游戏
Apr 04 Python
python 已知平行四边形三个点,求第四个点的案例
Apr 12 Python
django filter过滤器实现显示某个类型指定字段不同值方式
Jul 16 Python
python如何删除列为空的行
Jul 17 Python
如何基于Python Matplotlib实现网格动画
Jul 20 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
在VS2008中编译MYSQL5.1.48的方法
2010/07/03 PHP
PHP中is_file不能替代file_exists的理由
2014/03/04 PHP
JavaScript中String和StringBuffer的速度之争
2010/04/01 Javascript
js实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色
2010/05/27 Javascript
由JavaScript技术实现的web小游戏(不含网游)
2010/06/12 Javascript
扩展javascript的Date方法实现代码(prototype)
2010/11/20 Javascript
JS实现简易图片轮播效果的方法
2015/03/25 Javascript
介绍JavaScript中Math.abs()方法的使用
2015/06/14 Javascript
JS+CSS实现简易实用的滑动门菜单效果
2015/09/18 Javascript
jquery trigger函数执行两次的解决方法
2016/02/29 Javascript
jQuery过滤特殊字符及JS字符串转为数字
2016/05/26 Javascript
JS实现iframe自适应高度的方法示例
2017/01/07 Javascript
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
three.js加载obj模型的实例代码
2017/11/10 Javascript
JavaScript伪数组用法实例分析
2017/12/22 Javascript
微信小程序实现导航栏选项卡效果
2020/06/19 Javascript
Vue 通过自定义指令回顾v-内置指令(小结)
2018/09/03 Javascript
vue实现前台列表数据过滤搜索、分页效果
2019/05/28 Javascript
js+audio实现音乐播放器
2020/09/13 Javascript
react+antd 递归实现树状目录操作
2020/11/02 Javascript
python之wxPython应用实例
2014/09/28 Python
Python实现从log日志中提取ip的方法【正则提取】
2018/03/31 Python
python 获取文件下所有文件或目录os.walk()的实例
2018/04/23 Python
如何基于python实现不邻接植花
2020/05/01 Python
详解Python中的编码问题(encoding与decode、str与bytes)
2020/09/30 Python
使用python把xmind转换成excel测试用例的实现代码
2020/10/12 Python
Python制作运行进度条的实现效果(代码运行不无聊)
2021/02/24 Python
CSS3 圆角效果
2009/07/15 HTML / CSS
德国家用电器购物网站:Premiumshop24
2019/08/22 全球购物
应届毕业生求职自荐书
2014/01/03 职场文书
北京大学自荐信范文
2014/01/28 职场文书
工程师岗位职责规定
2014/02/26 职场文书
说明书格式及范文
2014/05/07 职场文书
项目经理任命书内容
2014/06/06 职场文书
大学生求职信怎么写
2015/03/19 职场文书
2016大学生入党积极分子心得体会
2016/01/06 职场文书