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中的标识运算符
May 14 Python
Python获取linux主机ip的简单实现方法
Apr 18 Python
详谈Python2.6和Python3.0中对除法操作的异同
Apr 28 Python
Pandas探索之高性能函数eval和query解析
Oct 28 Python
python字典嵌套字典的情况下找到某个key的value详解
Jul 10 Python
解决Mac下使用python的坑
Aug 13 Python
Django中的cookie和session
Aug 27 Python
Python Tkinter模块 GUI 可视化实例
Nov 20 Python
Python字符串hashlib加密模块使用案例
Mar 10 Python
解决pycharm不能自动补全第三方库的函数和属性问题
Mar 12 Python
利用django model save方法对未更改的字段依然进行了保存
Mar 28 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
Dec 01 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
PHPExcel在linux环境下导出报500错误的解决方法
2017/01/26 PHP
php实现JWT(json web token)鉴权实例详解
2019/11/05 PHP
宝塔面板在NGINX环境中TP5.1如何运行?
2021/03/09 PHP
Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器
2011/02/24 Javascript
java与javascript之间json格式数据互转介绍
2013/10/29 Javascript
三种动态加载js的jquery实例代码另附去除js方法
2014/04/30 Javascript
JQuery实现的购物车功能(可以减少或者添加商品并自动计算价格)
2015/01/13 Javascript
jquery实现翻动fadeIn显示的方法
2015/03/05 Javascript
3种js实现string的substring方法
2015/11/09 Javascript
jQuery CSS3自定义美化Checkbox实现代码
2016/05/12 Javascript
详解AngularJS如何实现跨域请求
2016/08/22 Javascript
jQuery的 $.ajax防止重复提交的两种方法(推荐)
2016/10/14 Javascript
js实现选项卡内容切换以及折叠和展开效果【推荐】
2017/01/08 Javascript
jQuery树控件zTree使用方法详解(一)
2017/02/28 Javascript
详解angular2实现ng2-router 路由和嵌套路由
2017/03/24 Javascript
JavaScript实现百度搜索框效果
2020/03/26 Javascript
React中Ref 的使用方法详解
2020/04/28 Javascript
NodeJS开发人员常见五个错误理解
2020/10/14 NodeJs
[03:48]2014DOTA2 TI专访71DK夺冠不靠小组赛高排名
2014/07/11 DOTA
python基于multiprocessing的多进程创建方法
2015/06/04 Python
Django 实现购物车功能的示例代码
2018/10/08 Python
opencv resize图片为正方形尺寸的实现方法
2019/12/26 Python
python字符串常用方法及文件简单读写的操作方法
2020/03/04 Python
Html5中的桌面通知Notification的实现
2018/09/25 HTML / CSS
瑞典最好的运动鞋专卖店:Sneakersnstuff
2016/08/29 全球购物
学校门卫工作职责
2013/12/07 职场文书
个人现实表现材料
2014/02/04 职场文书
护士岗前培训自我评鉴
2014/02/28 职场文书
成绩单公证书
2014/04/10 职场文书
公务员党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
大学生自荐信范文
2015/03/05 职场文书
2015年支教教师工作总结
2015/07/22 职场文书
《敬重卑微》读后感3篇
2019/11/26 职场文书
Java Dubbo框架知识点梳理
2021/06/26 Java/Android
Python天气语音播报小助手
2021/09/25 Python
pd.drop_duplicates删除重复行的方法实现
2022/06/16 Python