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的爬虫框架Scrapy来抓取豆瓣电影TOP250
Jan 20 Python
Python爬虫中urllib库的进阶学习
Jan 05 Python
Python检测网络延迟的代码
May 15 Python
Python小白必备的8个最常用的内置函数(推荐)
Apr 03 Python
python安装requests库的实例代码
Jun 25 Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
Jul 24 Python
Python银行系统实战源码
Oct 25 Python
python实现身份证实名认证的方法实例
Nov 08 Python
django数据模型(Model)的字段类型解析
Dec 25 Python
如何学习Python time模块
Jun 03 Python
Django数据模型中on_delete使用详解
Nov 30 Python
Tensorflow与RNN、双向LSTM等的踩坑记录及解决
May 31 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作的文本留言本的例子(二)
2006/10/09 PHP
六酷社区论坛HOME页清新格调免费版 下载
2007/03/07 PHP
php下安装配置fckeditor编辑器的方法
2011/03/02 PHP
Yii rules常用规则示例
2016/03/15 PHP
Yii2创建控制器(createController)方法详解
2016/07/23 PHP
Yii框架中jquery表单验证插件用法示例
2016/10/18 PHP
phpstudy隐藏index.php的方法
2020/09/21 PHP
页面版文本框智能提示JS代码
2009/11/20 Javascript
jQuery解决iframe高度自适应代码
2009/12/20 Javascript
js下关于onmouseout、事件冒泡的问题经验小结
2010/12/09 Javascript
解析javascript 数组以及json元素的添加删除
2013/06/26 Javascript
jQuery判断checkbox是否选中的小例子
2013/12/02 Javascript
js判断undefined类型,undefined,null, 的区别详细解析
2013/12/16 Javascript
JS调用页面表格导出excel示例代码
2014/03/18 Javascript
jQuery实现简单弹窗遮罩效果
2017/02/27 Javascript
JavaScript基于扩展String实现替换字符串中index处字符的方法
2017/06/13 Javascript
新版vue-cli模板下本地开发环境使用node服务器跨域的方法
2018/04/03 Javascript
swiper 自动图片无限轮播实现代码
2018/05/21 Javascript
vue实现商品加减计算总价的实例代码
2018/08/12 Javascript
jQuery轻量级表单模型验证插件
2018/10/15 jQuery
[00:32]2016完美“圣”典风云人物:Maybe宣传片
2016/12/05 DOTA
基于Django filter中用contains和icontains的区别(详解)
2017/12/12 Python
完美解决安装完tensorflow后pip无法使用的问题
2018/06/11 Python
Python tkinter label 更新方法
2018/10/11 Python
Python字符串格式化输出代码实例
2019/11/22 Python
基于Tensorflow的MNIST手写数字识别分类
2020/06/17 Python
CSS3 选择器 属性选择器介绍
2012/01/21 HTML / CSS
太阳镜仓库,售价20美元或更少:Sunglass Warehouse
2016/09/28 全球购物
C#如何判断当前用户是否输入某个域
2015/12/07 面试题
计算机专业大学生的自我评价
2013/11/14 职场文书
告诉你怎样写创业计划书
2014/01/27 职场文书
小学安全教育月活动总结
2014/07/07 职场文书
教师调动申请报告
2015/05/18 职场文书
2016大学生暑期三下乡心得体会
2016/01/23 职场文书
Nginx如何配置Http、Https、WS、WSS的方法步骤
2021/05/11 Servers
详解CSS开发过程中的20个快速提升技巧
2021/05/21 HTML / CSS