一、背景
- 有些情况下,我们面对实时更新的数据,希望能够在一个窗口中可视化出来,并且能够实时更新,方便我们观察数据的变化,从而进行数据分析,例如:绘制音频的波形,绘制动态曲线等,下面介绍使用matplotlib结合多线程绘制动态图,希望能帮助到有需要的朋友。
- 本人遇到的场景:最近刚好在学习人工智能中的遗传算法,并且使用该算法求解TSP,了解这个算法的朋友知道这个算法是通过不断迭代,寻找适应度大的最优解,为了了解迭代过程中适应度的变化,我希望能够实时更新迭代过程中的适应度,将其可视化出来(数据量不断增大)
- 直接上图:
二、步骤
1、使用matplotlib绘制动态图
2、创建一个线程用于更新数据
三、代码框架
import threading
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import matplotlib.lines as line
import numpy as np
CHUNK = 2048
data=np.random.normal(0,1,CHUNK)
fig = plt.figure()
ax = plt.subplot(111,ylim=(0,5))
line = line.Line2D([], [])
def plot_init():
ax.add_line(line)
return line,
def plot_update(i):
global data
data_copy = data.copy()
x_data=np.arange(0,data_copy.shape[0],1)
ax.set_xlim(0,data_copy.shape[0])
ax.set_title("title",fontsize=8)
line.set_xdata(x_data)
line.set_ydata(data_copy)
plt.suptitle('Suptitle',fontsize=8)
ax.figure.canvas.draw()
return line,
ani = animation.FuncAnimation(fig,
plot_update,
init_func=plot_init,
frames=1,
interval=30,
blit=True)
def dataUpdate_thead():
global data
while True:
data=np.random.normal(0,1,CHUNK)
ad_rdy_ev = threading.Event()
ad_rdy_ev.set()
t = threading.Thread(target=dataUpdate_thead, args=())
t.daemon = True
t.start()
plt.show()
ad_rdy_ev = threading.Event()
ad_rdy_ev.set()
t = threading.Thread(target=dataUpdate_thead, args=())
t.daemon = True
t.start()
plt.show()
- 效果: