python matplotlib绘制动态曲线绘制动态曲线 数据流可视化数据流可视化
很多时候需要在程序运行过程中,查看一些数据的动态变化,最容易想到的是像opencv那样直接循环使用imshow()形成动态
画面,但是由于matplotlib中的显示模式是阻塞模式,在plt.show()之后程序就会暂停在那,打开一个窗口以后必须关掉才能继
续执行,这样用matplotlib画动态图就像播放ppt,关闭一个窗口后弹出下一个。关于matplotlib包的任何信息都可以直接在它官
网查询。本文总结了几种方法实现在程序运行中绘制动态图的方法,以画动态正弦曲线为例。
第一种方法:第一种方法:plt.show()放在程序最后放在程序最后
既然plt.show会阻塞后面的程序,那么就把plt.show放在程序最后。另外要在每次plot以前清除上次显示结果,并让画图窗口暂
停一段时间来显示。
import matplotlib.pyplot as plt
import numpy as np
POINTS = 100
sin_list = [0] * POINTS
indx = 0
# fig, ax = plt.subplots()
while True:
if indx == 40:
indx = 0
indx += 1
# 更新绘图数据
sin_list = sin_list[1:] + [np.sin((indx / 20) * np.pi)] # 显示时间
plt.pause(0.01)
# 清除上一次显示
plt.cla()
plt.plot(sin_list)
#plt.show()如果放在这个位置就会卡住
plt.show() #放在最后不会影响之后的代码执行
第二种方法:用第二种方法:用plt.draw()代替代替plt.show()
还可以用plt.draw()代替plt.show(),plt.draw放置的位置就比较多了,也要在程序中清除上次显示结果,并让画图窗口暂停一段
时间来显示,画正弦函数动态图例子如下:
import matplotlib.pyplot as plt
import numpy as np
POINTS = 100
sin_list = [0] * POINTS
indx = 0
# fig, ax = plt.subplots()
while True:
if indx == 40:
indx = 0
indx += 1
# 更新绘图数据
sin_list = sin_list[1:] + [np.sin((indx / 20) * np.pi)] # 显示时间
plt.pause(0.01)
# 清除上一次显示
plt.cla()
plt.plot(sin_list)
# plt.draw()也可以放在这个位置,不会阻塞
plt.draw()
第三种方法:用第三种方法:用plt.on()
另一种方法是在程序前面用plt.on()开启交互模式,交互模式下plot之后直接显示出来,不再需要用plt.show(),并且显示时画
图闪现就继续执行下去,因此也要让窗口暂停一段时间。同样是画正弦函数动态图例子如下:
import matplotlib.pyplot as plt
import numpy as np
POINTS = 100
sin_list = [0] * POINTS
indx = 0
# 开启交互模式
plt.ion()
评论5