Matplotlib 创建实时动画图
Matplotlib create real time animated graph
我很难设置我的代码来创建实时动画图形,我的代码是在收集数据后绘制图形,而不是显示每次迭代。我的脚本运行一个回归函数,然后存储在一个文件中,然后我访问这些文件并绘制它们,这就是我所拥有的,我需要四处移动或更改什么才能实时绘制图形?我尝试将绘图函数移动到 for
循环中,但没有用,有什么建议吗?
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()
class RegrMagic
是 mocks Regr_magic()
的帮手。 __call__
方法使这个 class 的一个实例表现得像一个函数。它具有状态并为每次调用生成数字 1, 0.56565
、2, 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()
我很难设置我的代码来创建实时动画图形,我的代码是在收集数据后绘制图形,而不是显示每次迭代。我的脚本运行一个回归函数,然后存储在一个文件中,然后我访问这些文件并绘制它们,这就是我所拥有的,我需要四处移动或更改什么才能实时绘制图形?我尝试将绘图函数移动到 for
循环中,但没有用,有什么建议吗?
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()
class RegrMagic
是 mocks Regr_magic()
的帮手。 __call__
方法使这个 class 的一个实例表现得像一个函数。它具有状态并为每次调用生成数字 1, 0.56565
、2, 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()