python中plot实现即时数据动态显示方法

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)

 

python中plot实现即时数据动态显示方法_第1张图片

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)

python中plot实现即时数据动态显示方法_第2张图片

 

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)
 

 

你可能感兴趣的:(python中plot实现即时数据动态显示方法)