随着时间的推移,在Matplotlib底图上为多个点设置动画

时间:2014-01-21 17:23:53

标签: python matplotlib matplotlib-basemap

我正在尝试在matplotlib.basemap地图上创建一系列带有纬度/经度位置的点的动画图。每个点都有一系列的一系列日期,我已经阅读了pandas DataFrame

我尝试修改使用HERE执行此操作的过程,但我收到的错误是global name 'points' is not defined。我试图在init例程中将其声明为全局,但这没有帮助。

我该怎么做?

示例数据:

day,id,      lon,      lat
156, 1, 67.53453, -4.00454
156, 2, 66.73453,  0.78454
156, 3, 68.23453, -1.01454
157, 1, 67.81453, -4.26454
157, 2, 66.42653,  0.91454
157, 3, 69.11253, -1.01454
158, 1, 68.12453, -3.26454
158, 2, 67.10053,  1.01454
158, 3, 68.01253, -2.61454

调用例程:

if datafile != None:
    data = readdata(datafile)
    dates = np.unique(data.daynr).values

    x,y = m(0,0)
    point = m.plot(x,y, 'ro', markersize=5)[0]
    points = list()

    anim = animation.FuncAnimation(plt.gcf(), animate,
                                   init_func=init, frames=20,
                                   interval=500, blit=True)

    # Add current date/time or something to make unique
    anim.save('movement.mp4', fps=15,
              extra_args=['-vcodec', 'libx264'])

initanimate和数据读取例程:

def init():
    for pt in points:
        pt.set_data([], [])
    return points

def animate(i):
    lons = data.lons[data.daynr==dates[i]]
    lats = data.lats[data.daynr==dates[i]]

    i = 0
    for lon,lat, pt in zip(points, lons, lats):
        x, y = map(lon,lat)
        pt.set_data(x, y)
        i = i + 1
    return points

def readdata(datafile):
    dtypes = np.dtype([
                    ('daynr',int),      #00 - Simulation day number
                    ('id',int),         #01 - Id
                    ('lon',float),      #02 - Longitude
                    ('lat',float),      #03 - Latitude
                    ])
    f = open(datafile, 'rb')
    data = pd.read_csv(f, index_col=False, names=dtypes.names,
                           dtype=dtypes, header=None)
    f.close()
    return data

1 个答案:

答案 0 :(得分:2)

所以......我的第一个问题是我没有意识到python中函数内的变量不被认为是“全局”的函数。

为了解决这个问题,我创建了init()animate(i)函数'子函数',然后允许父函数中声明的变量被init()和{视为全局变量{1}}子函数(参见下面的代码)。

我发现this blog article对我的解决方案非常有帮助。

this SO question一样。

注意:我为了这个答案而编辑了我的代码,所以如果这对你不适用,请发表评论。

我的绘图功能和调用程序:

animate(i)