使用Matplotlib创建CSV数据的实时图

时间:2015-08-10 14:18:39

标签: python csv python-3.x matplotlib

我正在尝试使用Matplotlib来显示某些测量值。测量通常持续约24小时,并将包括csv中约30k行的数据。我一直在努力让我的情节实际上是动画。我可以执行代码,它会显示一个截至当前时间点的快照,但不会显示任何其他内容。当我尝试自动缩放它时,没有任何绘图,它只是在两个轴上默认为-.6到+.6的视图。我应该调用plt.draw()来实现这个目的吗?这就是我到目前为止所做的:

import numpy as np
import datetime as dt
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import animation

FMT = '%Y-%m-%d %H:%M:%S.%f'
data = np.genfromtxt('sampleData.csv', delimiter=',', skip_header=5,
                 names=['x', 'y', 'z', 'w'], dtype=['object', 'int8', 'int8', 'float'])                  

mytime = [dt.datetime.strptime(i.decode('ascii'), FMT) for i in data['x']]
thickness = data['w']

fig = plt.figure()
axes = fig.add_subplot(111)
line, = axes.plot([], [], '.')
plt.show(block=False)

def init():
    line.set_data([],[]) 
    return line,

fig.canvas.draw()

def animate(i):
    xdata = mytime[:i]
    ydata = thickness[:i]
    line.set_data(xdata, ydata)
    plt.draw()
    axes.relim()
    axes.autoscale(True,'both',True) 
    axes.autoscale_view(True,True,True)
    return line,

anim = animation.FuncAnimation(fig, animate, init_func=init,  
                           interval=0, blit=True)

plt.show()

这是CSV的数据样本:

2013-09-25 14:51:15.329091,1,0,439.80,,,,0,0,

2 个答案:

答案 0 :(得分:11)

你有两个问题。一个是因为你有效地绘制了两次东西,第二个是纯粹的人类心理学(随着时间的推移,情节看起来会变慢,因为你将一个点添加到10000而将一个点添加到10或100)。

让我们先讨论双重抽奖:

void xyz() { .. MyOtherClass.staticMethod(SomeClass.class); .. } MyOtherClass { .. <T> T staticMethod(Class<T> clazz) { } ... } 将为您绘制内容,但通过告诉它使用blitting,它只更新轴的内部而不是刻度等。因此,您需要手动调用FuncAnimation ,但动画也会调用draw

通过删除draw_artistblit=True

,您应该能够获得至少2倍的加速

此外,通过设置plt.draw(),你会强制它不断绘制,这将有效地阻止事情锁定。将间隔设置为更合理的范围,例如interval=0(间隔以毫秒为单位。“25”为40 fps。)。

例如,这对我来说非常顺利:

25

我还添加了import numpy as np import matplotlib.pyplot as plt from matplotlib import animation y = np.random.normal(0, 1, 10000).cumsum(axis=0) x = np.arange(y.size) fig, ax = plt.subplots() line, = ax.plot([], [], '.') ax.margins(0.05) def init(): line.set_data(x[:2],y[:2]) return line, def animate(i): i = min(i, x.size) xdata = x[:i] ydata = y[:i] line.set_data(xdata, ydata) ax.relim() ax.autoscale() return line, anim = animation.FuncAnimation(fig, animate, init_func=init, interval=25) plt.show() 以避免轴限制捕捉到下一个最近的“偶数”数字并给出“生涩”的外观。

但是,由于您正在逐步绘制越来越多的数据,因此变化率似乎会变慢,因为较少的数据似乎随着时间的推移而变化。在10000结束时添加一个点几乎不可察觉,但在10结束时添加一个点非常显着。

因此,情节看起来很多在开始时比在结束时更令人兴奋,即使它以相同的速率更新。

这与matplotlib没有任何关系,而且是您选择动画数据的方式的结果。

要解决这个问题,您可以考虑在数据中移动“滑动窗口”,并一次绘制一个恒定数量的点。举个例子:

ax.margins(0.05)

答案 1 :(得分:0)

我有以下列作为pandas过滤器列的操作:

    Object      A_START_TIME   B_START_TIME  B_STOP_TIME       A_STOP_TIME
0     17          27158762       27158803      27178575          27259032 

1     18          27259557       27259605      27263225          27323232

2     19          27323266       27323299      27332959          27341878

我正在考虑绘制如下所示的内容:

for 17 : A_START_TIME----[B_START_TIME========B_STOP_TIME]-------A_STOP_TIME

For 18 : A_START_TIME----[B_START_TIME========B_STOP_TIME]-------A_STOP_TIME