博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python中plot实现即时数据动态显示方法
阅读量:4088 次
发布时间:2019-05-25

本文共 4041 字,大约阅读时间需要 13 分钟。

1. 通用的方法

1.1 需要保存历史数据

示例代码1-1

import matplotlib.pyplot as plt

import numpy as np
import time
from math import *

plt.ion() #开启interactive mode 成功的关键函数

plt.figure(1)
t = [0]
t_now = 0
m = [sin(t_now)]

for i in range(2000):

    plt.clf() #清空画布上的所有内容
    t_now = i*0.1
    t.append(t_now)#模拟数据增量流入,保存历史数据
    m.append(sin(t_now))#模拟数据增量流入,保存历史数据
    plt.plot(t,m,'-r')
    plt.draw()#注意此函数需要调用
    time.sleep(0.01)

 

备注:此代码经过很多人测试发现不能呈现动态效果(我原本在ubuntu系统上是可以的,经验证在windows上也不行),特在此说明,如果出不了动态效果,就将

plt.draw()

time.sleep(0.01)

替换为:

plt.pause(0.01)

 

1.2 无需保存数据

示例代码1-2

import matplotlib.pyplot as plt

import numpy as np
import time
from math import *

plt.ion() #开启interactive mode 成功的关键函数

plt.figure(1)
t = [0]
t_now = 0
m = [sin(t_now)]

for i in range(2000):

    # plt.clf() # 清空画布上的所有内容。此处不能调用此函数,不然之前画出的点,将会被清空。
    t_now = i*0.1
    """
    由于第次只画一个点,所以此处有两种方式,第一种plot函数中的样式选
    为点'.'、'o'、'*'都可以,就是不能为线段'-'。因为一条线段需要两
    个点才能确定。第二种方法是scatter函数,也即画点。
    """
    plt.plot(t_now,sin(t_now),'.') # 第次对画布添加一个点,覆盖式的。
    # plt.scatter(t_now, sin(t_now)) 

    plt.draw()#注意此函数需要调用

    time.sleep(0.01)
这里写图片描述

1.3 无需保存数据(进阶版)

以上是动态的显示一个函数,也即直观上一条轨迹不断的延伸。这是一种应用,另一种应用是在一张画布上增量式的画多条轨迹(函数)。


示例代码1-3

import matplotlib.pyplot as plt

import numpy as np
import time
from math import *
 
plt.ion() #开启interactive mode 成功的关键函数
plt.figure(1)
t = np.linspace(0, 20, 100)

 
for i in range(20):
    # plt.clf() # 清空画布上的所有内容。此处不能调用此函数,不然之前画出的轨迹,将会被清空。
    y = np.sin(t*i/10.0)
    plt.plot(t, y) # 一条轨迹
    plt.draw()#注意此函数需要调用
    time.sleep(1)

这里写图片描述

Jupyter notebook版本

也对应三种应用:需要保存历史数据,无需保存历史数据,无需保存历史数据进阶版。
注意:在Jupyter notebook中显示python的画图程序时,需要添加%matplotlib inline,但是身边有人运行本博客中的程序时会出现无法正常显示动态图片的情况,并且本人在自己电脑windows 10环境下(python 3.6)运行本文中动态显示图片的程序时,也会出现上述情况。出现该情况,只需要将程序中出现的所有inline改为qt5,例如%matplotlib inline改为%matplotlib qt5,以及is_ipython = 'inline' in matplotlib.get_backend()改为is_ipython = 'qt5' in matplotlib.get_backend()即可。基于QT的图形显示界面会跳出jupyter notebook显示动态图,而且会多出许多可选的按钮。大家可以自行探索。建议大家,先运行本文的程序,如果不成功,再做此改变。因为,原本inline成功的,改为qt5后,可能反而不成功。
2.1 需要保存历史数据

示例代码2-1

上面的方式,可以在跳出的画图面板内动态显示,但是如果想在jupyter notebook中直接动态显示,上面的方法将无效。因此,补上在jupyter notebook中可行的动态显示示例程序。以供举一反三之用。

 

import math

import random
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline

# set up matplotlib

is_ipython = 'inline' in matplotlib.get_backend()
if is_ipython:
    from IPython import display

plt.ion()

def plot_durations(y):

    plt.figure(2)
    plt.clf()
    plt.subplot(211)
    plt.plot(y[:,0])
    plt.subplot(212)
    plt.plot(y[:,1])

    plt.pause(0.001)  # pause a bit so that plots are updated

    if is_ipython:
        display.clear_output(wait=True)
        display.display(plt.gcf())
        
x = np.linspace(-10,10,500)
y = []
for i in range(len(x)):
    y1 = np.cos(i/(3*3.14))
    y2 = np.sin(i/(3*3.14))
    y.append(np.array([y1,y2])) #保存历史数据
    plot_durations(np.array(y))

这里写图片描述

2.2 无需保存历史数据


示例代码2-2

import math

import random
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline

# set up matplotlib

is_ipython = 'inline' in matplotlib.get_backend()
if is_ipython:
    from IPython import display

plt.ion()

def plot_durations(i, y1, y2):

    plt.figure(2)
#     plt.clf() 此时不能调用此函数,不然之前的点将被清空。
    plt.subplot(211)
    plt.plot(i, y1, '.')
    plt.subplot(212)
    plt.plot(i, y2, '.')

    plt.pause(0.001)  # pause a bit so that plots are updated

    if is_ipython:
        display.clear_output(wait=True)
        display.display(plt.gcf())
        
x = np.linspace(-10,10,500)
y = []
for i in range(len(x)):
    y1 = np.cos(i/(3*3.14))
    y2 = np.sin(i/(3*3.14))
#     y.append(np.array([y1,y2])) #保存历史数据
    plot_durations(i, y1, y2)
这里写图片描述

 

2.3 无需保存历史数据(进阶版)


示例代码2-3

import math

import random
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline

# set up matplotlib

is_ipython = 'inline' in matplotlib.get_backend()
if is_ipython:
    from IPython import display

plt.ion()

def plot_durations(y1, y2):

    plt.figure(2)
#     plt.clf()
    plt.subplot(211)
    plt.plot(x, y1)
    plt.subplot(212)
    plt.plot(x, y2)

    plt.pause(0.001)  # pause a bit so that plots are updated

    if is_ipython:
        display.clear_output(wait=True)
        display.display(plt.gcf())

 

x = np.linspace(-10,10,500)

for i in range(100):
    y1 = np.cos(x*i/(3*3.14))
    y2 = np.sin(x*i/(3*3.14))
    plot_durations(y1, y2)
 

这里写图片描述

 

你可能感兴趣的文章
数据挖掘流程
查看>>
Hadoop — HDFS的概念、原理及基本操作
查看>>
机器学习算法原理解析 - 集成
查看>>
Spark SQL基本概念与基本用法
查看>>
Spark RDD基本概念与基本用法
查看>>
Elasticsearch 6.4基本操作 - Java版
查看>>
Hadoop — Yarn原理解析
查看>>
Storm基本原理概念及基本使用
查看>>
Spark源码剖析 - SparkContext的初始化(三)_创建并初始化Spark UI
查看>>
机器学习算法原理解析 - 聚类
查看>>
Spark源码剖析 - SparkContext的初始化(二)_创建执行环境SparkEnv
查看>>
大数据之统计学基础
查看>>
机器学习算法原理解析 - 分类
查看>>
Spark源码剖析 - SparkContext的初始化(一)
查看>>
Elasticsearch-基础介绍及索引原理分析(转载)
查看>>
机器学习算法原理解析 - 回归
查看>>
Spark源码剖析 - 任务提交与执行
查看>>
Spark源码剖析 - SparkContext的初始化(十)_Spark环境更新
查看>>
Spark源码剖析 - 计算引擎
查看>>
Spark源码剖析 - SparkContext的初始化(四)_Hadoop相关配置及Executor环境变量
查看>>