我正在尝试使用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,
答案 0 :(得分:11)
你有两个问题。一个是因为你有效地绘制了两次东西,第二个是纯粹的人类心理学(随着时间的推移,情节看起来会变慢,因为你将一个点添加到10000而将一个点添加到10或100)。
让我们先讨论双重抽奖:
void xyz() {
..
MyOtherClass.staticMethod(SomeClass.class);
..
}
MyOtherClass {
..
<T> T staticMethod(Class<T> clazz) {
}
...
}
将为您绘制内容,但通过告诉它使用blitting,它只更新轴的内部而不是刻度等。因此,您需要手动调用FuncAnimation
,但动画也会调用draw
。
通过删除draw_artist
和blit=True
此外,通过设置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