我正在尝试在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'])
init
,animate
和数据读取例程:
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
答案 0 :(得分:2)
所以......我的第一个问题是我没有意识到python中函数内的变量不被认为是“全局”的函数。
为了解决这个问题,我创建了init()
和animate(i)
函数'子函数',然后允许父函数中声明的变量被init()
和{视为全局变量{1}}子函数(参见下面的代码)。
我发现this blog article对我的解决方案非常有帮助。
与this SO question一样。
注意:我为了这个答案而编辑了我的代码,所以如果这对你不适用,请发表评论。
我的绘图功能和调用程序:
animate(i)