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中何种情况下需要使用断言
Apr 01 Python
Python的Flask框架中Flask-Admin库的简单入门指引
Apr 07 Python
Python统计日志中每个IP出现次数的方法
Jul 06 Python
python实现黑客字幕雨效果
Jun 21 Python
flask-restful使用总结
Dec 04 Python
Tensorflow 多线程设置方式
Feb 06 Python
Selenium使用Chrome模拟手机浏览器方法解析
Apr 10 Python
使用Python3 poplib模块删除服务器多天前的邮件实现代码
Apr 24 Python
python3环境搭建过程(利用Anaconda+pycharm)完整版
Aug 19 Python
利用python查看数组中的所有元素是否相同
Jan 08 Python
python 多线程爬取壁纸网站的示例
Feb 20 Python
python实现简单反弹球游戏
Apr 12 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
ThinkPHP CURD方法之field方法详解
2014/06/18 PHP
PHP会话操作之cookie用法分析
2016/09/28 PHP
Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】
2019/05/08 PHP
Javascript的IE和Firefox兼容性汇编(zz)
2007/02/02 Javascript
用jquery实现下拉菜单效果的代码
2010/07/25 Javascript
ActiveX控件与Javascript之间的交互示例
2014/06/04 Javascript
自己编写的支持Ajax验证的JS表单验证插件
2015/05/15 Javascript
跟我学习javascript的prototype使用注意事项
2015/11/17 Javascript
JavaScript必知必会(二) null 和undefined
2016/06/08 Javascript
老生常谈JavaScript 函数表达式
2016/09/01 Javascript
Javascript中的async awai的用法
2017/05/17 Javascript
nodejs项目windows下开机自启动的方法
2017/11/22 NodeJs
详解Node使用Puppeteer完成一次复杂的爬虫
2018/04/18 Javascript
node实现分片下载的示例代码
2018/10/17 Javascript
详解如何在vue项目中使用eslint+prettier格式化代码
2018/11/10 Javascript
js使用swiper实现层叠轮播效果实例代码
2018/12/12 Javascript
Vue之Mixins(混入)的使用方法
2019/09/24 Javascript
IntelliJ IDEA编辑器配置vue高亮显示
2019/09/26 Javascript
python处理json数据中的中文
2014/03/06 Python
python对配置文件.ini进行增删改查操作的方法示例
2017/07/28 Python
python实现感知器算法详解
2017/12/19 Python
使用python3+xlrd解析Excel的实例
2018/05/04 Python
opencv之为图像添加边界的方法示例
2019/12/26 Python
Python内置数据类型list各方法的性能测试过程解析
2020/01/07 Python
python Cartopy的基础使用详解
2020/11/01 Python
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
阿迪达斯比利时官方商城:adidas比利时
2016/10/10 全球购物
世界第一曲奇连锁店:Mrs. Fields Cookies
2017/02/04 全球购物
香港士多网上超级市场:Ztore
2021/01/09 全球购物
毕业生自荐书模版
2014/01/04 职场文书
九年级英语教学反思
2014/01/31 职场文书
执行总经理岗位职责
2014/02/03 职场文书
小学学雷锋活动总结
2014/04/25 职场文书
优秀班集体事迹材料
2014/12/25 职场文书
工作自我评价范文
2019/03/21 职场文书
PHP中国际化的字符串排序和比较对象详解
2021/08/23 PHP