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文件夹与文件的相关操作(推荐)
Jul 25 Python
Python使用修饰器执行函数的参数检查功能示例
Sep 26 Python
Python实现识别手写数字 Python图片读入与处理
Mar 23 Python
python中计算一个列表中连续相同的元素个数方法
Jun 29 Python
python 公共方法汇总解析
Sep 16 Python
Python爬虫使用浏览器cookies:browsercookie过程解析
Oct 22 Python
解决Python二维数组赋值问题
Nov 28 Python
python重要函数eval多种用法解析
Jan 14 Python
Python基于内置库pytesseract实现图片验证码识别功能
Feb 24 Python
Python 读取xml数据,cv2裁剪图片实例
Mar 10 Python
Python正则表达式如何匹配中文
May 27 Python
Django权限控制的使用
Jan 07 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中几个常用的魔术常量
2012/02/23 PHP
php计算数组相同值出现次数的代码(array_count_values)
2015/01/20 PHP
php返回当前日期或者指定日期是周几
2015/05/21 PHP
PHP进程通信基础之信号量与共享内存通信
2017/02/19 PHP
JavaScript 密码强度判断代码
2009/09/05 Javascript
dwz 如何去掉ajaxloading具体代码
2013/05/22 Javascript
jquery 循环显示div的示例代码
2013/10/18 Javascript
javascript中对Attr(dom中属性)的操作示例讲解
2013/12/02 Javascript
javaScript 计算两个日期的天数相差(示例代码)
2013/12/27 Javascript
JavaScript组件焦点与页内锚点间传值的方法
2015/02/02 Javascript
jQuery源码解读之addClass()方法分析
2015/02/20 Javascript
纯js实现悬浮按钮组件
2016/12/17 Javascript
详解如何使用webpack+es6开发angular1.x
2017/08/16 Javascript
关于JavaScript语句后面的分号问题
2017/12/07 Javascript
实例解析ES6 Proxy使用场景介绍
2018/01/08 Javascript
Bootstrap Table实现定时刷新数据的方法
2018/08/13 Javascript
[36:22]VP vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
为Python程序添加图形化界面的教程
2015/04/29 Python
Python编程实现二叉树及七种遍历方法详解
2017/06/02 Python
Python安装lz4-0.10.1遇到的坑
2018/05/20 Python
基于Pandas读取csv文件Error的总结
2018/06/15 Python
Django之创建引擎索引报错及解决详解
2019/07/17 Python
Python第三方库的几种安装方式(小结)
2020/04/03 Python
python实现输入三角形边长自动作图求面积案例
2020/04/12 Python
用 Python 制作地球仪的方法
2020/04/24 Python
Python多线程threading创建及使用方法解析
2020/06/17 Python
Keras自动下载的数据集/模型存放位置介绍
2020/06/19 Python
大学学习生活感言
2014/01/18 职场文书
小学教师寄语大全
2014/04/03 职场文书
12.4法制宣传日标语
2014/10/08 职场文书
个人年度总结报告
2015/03/09 职场文书
2016年暑假家长对孩子评语
2015/12/01 职场文书
2016大一新生军训感言
2015/12/08 职场文书
2016保送生自荐信范文
2016/01/29 职场文书
《群青的幻想曲》京力秋树角色PV公开
2022/04/08 日漫
配置nginx负载均衡
2022/05/06 Servers