使用matplotlib从pcolormesh动画化Quadmesh

时间:2014-01-31 18:55:30

标签: python animation matplotlib

由于整整一天的反复试验,我将调查结果发布给任何可能遇到此问题的人。

在过去的几天里,我一直在尝试模拟netCDF文件中某些雷达数据的实时情节,以便与我正在为学校项目建立的GUI一起工作。我尝试的第一件事是使用matplotlib的“交互模式”简单地重绘数据,如下所示:

import matplotlib.pylab as plt

fig = plt.figure()
plt.ion() #Interactive mode on
for i in range(2,155): #Set to the number of rows in your quadmesh, start at 2 for overlap
    plt.hold(True)
    print i
    #Please note: To use this example you must compute X, Y, and C previously.
    #Here I take a slice of the data I'm plotting - if this were a real-time
    #plot, you would insert the new data to be plotted here.
    temp = plt.pcolormesh(X[i-2:i], Y[i-2:i], C[i-2:i])
    plt.draw()
    plt.pause(.001) #You must use plt.pause or the figure will freeze

 plt.hold(False)      
 plt.ioff() #Interactive mode off

虽然这在技术上有效,但它也会禁用缩放功能,以及平移,以及所有内容!

对于雷达显示图,这是不可接受的。请参阅下面的解决方案。

1 个答案:

答案 0 :(得分:3)

所以我开始研究matplotlib动画API,希望找到一个解决方案。虽然它在切片中使用QuadMesh对象并没有完全记录,但动画确实是我正在寻找的。这就是我最终想出来的:

import matplotlib.pylab as plt
from matplotlib import animation

fig = plt.figure()

plt.hold(True)
#We need to prime the pump, so to speak and create a quadmesh for plt to work with
plt.pcolormesh(X[0:1], Y[0:1], C[0:1])

anim = animation.FuncAnimation(fig, animate, frames = range(2,155), blit = False)

plt.show()
plt.hold(False)

def animate( self, i):
    plt.title('Ray: %.2f'%i)
    #This is where new data is inserted into the plot.
    plt.pcolormesh(X[i-2:i], Y[i-2:i], C[i-2:i])

请注意,blit必须为False!否则,它会向你大吼大叫QuadMesh对象不是“可迭代”的。

我还没有访问雷达,所以我无法对实时数据流进行测试,但对于静态文件,它迄今为止运行良好。在绘制数据时,我可以使用动画进行缩放和平移。

祝你好运动画/策划野心!