为了账号安全,请及时绑定邮箱和手机立即绑定

简单的 matplotlib.animation 图变得非常快而且比停止更慢

简单的 matplotlib.animation 图变得非常快而且比停止更慢

撒科打诨 2021-08-05 10:38:21
我已经开始学习 matplotlib 函数,因为我想可视化我通过 websocket 接收到的数据。为此,我制作了一个模拟主程序行为的虚拟程序,但添加了 mathplotlib 的功能。我注意到该程序需要越来越多的时间来完成每个循环并最终“冻结”。我设法通过改变以延长其寿命interval在animation.FuncAnimation1000〜10000但这只是程序阴谋有时可达787-9数据的1间新的和平。我认为问题在于清理旧地块的方式不当。但我不知道我到底在哪里做错了import timeimport datetimeimport timeitimport queueimport osimport randomimport copyimport matplotlib.pyplot as pltimport matplotlib.animation as animationq = queue.Queue()beta=[0,]b=Falseczas=[]produkty=["primo"]cena=[[] for _ in range(len(produkty))]fig=plt.figure()#ax1=fig.add_subplot(1,1,1)#ax2=fig.add_subplot(1,1,1)ax1=plt.subplot(1,1,1)ax2=plt.subplot(1,1,1)def animate(i):    ax1.clear()    ax2.clear()    ax1.plot(czas,cena[0])    ax2.plot(czas,beta)while True:    time.sleep(1)    alpfa=time.time()    #input('press enter')    rand_produkt=random.choice(produkty)     rand_price=random.randint(1,10)    rand_czas=time.ctime()    alfa={'type':'ticker','price':rand_price,'product_id':rand_produkt,'time':rand_czas}    q.put(alfa)    if q.not_empty:                    dane=q.get()                typ=dane.get('type',None)        if typ=='ticker':            price=dane.get('price', None)            pair=dane.get('product_id',None)            t=dane.get('time', None)            b=True    if b==True:        b=False        produkt_id=produkty.index(pair)        cena[produkt_id].append(float(price))        czas.append(t)    plt.ion()    ani=animation.FuncAnimation(fig,animate,interval=1000)#, blit=True)repeat=True)    plt.show()    plt.pause(0.001)    #fig.clf()    beta.append(time.time()-alpfa)    print(beta[-1])
查看完整描述

1 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

您的代码的问题在于您在 while 循环中调用了一个新动画。因此,这将导致线路变慢。最好开始你的情节。一种技巧可能是直接更新对象数据:


from matplotlib.pyplot import subplots, pause, show

from numpy import sin, pi


fig, ax = subplots()


x = [0]

y = [sin(2 * pi * x[-1])]

p1, = ax.plot(x, y) 


show(block = False)

while True:

    # update data

    x.append(x[-1] + .1)

    y.append(sin(2 * pi * x[-1]))

    p1.set_data(x, y) # update data

    ax.relim()        # rescale axis

    ax.autoscale_view()# update view

    pause(1e-3)


查看完整回答
反对 回复 2021-08-05
  • 1 回答
  • 0 关注
  • 325 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信