Matplotlib创建实时动画图形



我很难设置我的代码来创建实时动画图,我的代码是在收集数据后绘制的,而不是显示每次迭代。我的脚本运行一个回归函数,然后存储在一个文件中,然后我访问文件并绘制它们,这是我所拥有的,我需要移动或更改什么才能实时绘制图形?我试着在for循环中移动plot函数,但没有成功,有什么建议吗?

 fig = plt.figure()
 ax1 = fig.add_subplot(1,1,1)
 num = 10 
 for idx in range(1,num):
    c,e = Regr_magic()
        with open("CK_output.txt",'a') as CK:
            CK.write("{0},{1}n".format(idx,c))
        with open("error_output.txt",'a') as E:
            E.write("{0},{1}n".format(idx,e))

    def animate(i):
        pull = open('error_output.txt','r').read()
        data = pull.split('n')
        xar = []
        yar = []
        for each in data:
            if len(each)>1:
                x,y = each.split(',')
                xar.append(float(x))
                yar.append(float(y))
            ax1.plot(xar, yar)
    ani = animation.FuncAnimation(fig, animate, interval=1000)
    plt.show()

仅供参考,数据文件包含以下内容,迭代次数和Ck值或错误,所以它们看起来像这个

1,.0554
2,.0422
3,.0553
4,.0742
5,.0232

预计算结果的解决方案

这将根据输出文件中的数据制作出一个不错的动画:

from matplotlib import pyplot as plt
from matplotlib import animation

fig = plt.figure()
with open('error_output.txt') as fobj:
    x, y = zip(*([float(x) for x in line.split(',')] for line in fobj))

def animate(n):
    line, = plt.plot(x[:n], y[:n], color='g')
    return line,
anim = animation.FuncAnimation(fig, animate, frames=len(x), interval=1000)
plt.show()

计算值时实时动画的解决方案

这里是一个允许regr_magic:生成的数据实时动画的版本

import random
import time
from matplotlib import pyplot as plt
from matplotlib import animation

class RegrMagic(object):
    """Mock for function Regr_magic()
    """
    def __init__(self):
        self.x = 0
    def __call__(self):
        time.sleep(random.random())
        self.x += 1
        return self.x, random.random()
regr_magic = RegrMagic()
def frames():
    while True:
        yield regr_magic()
fig = plt.figure()
x = []
y = []
def animate(args):
    x.append(args[0])
    y.append(args[1])
    return plt.plot(x, y, color='g')

anim = animation.FuncAnimation(fig, animate, frames=frames, interval=1000)
plt.show()

RegrMagic是模拟Regr_magic()的助手。__call__方法使这个类的实例表现得像一个函数。它具有状态并为每个呼叫产生数字1, 0.565652, 0.65566等(第二个数字是随机数)。它还有一个时间延迟来模拟计算时间。

重要的是frames()。用Regr_magic()替换Regr_magic(),应该可以使用。

具体问题的解决方案

没有模拟的版本:

import random
import time
from matplotlib import pyplot as plt
from matplotlib import animation

def frames():
    while True:
        yield Regr_magic()

fig = plt.figure()
x = []
y = []
def animate(args):
    x.append(args[0])
    y.append(args[1])
    return plt.plot(x, y, color='g')

anim = animation.FuncAnimation(fig, animate, frames=frames, interval=1000)
plt.show()

最新更新