我终其一生都无法弄清楚如何使用动画功能在 Matplotlib basemap 上为点(地震震中)制作动画。我试过实现 this示例代码添加到我的脚本中,但我所有的点都在一次绘制。可能跟我的函数和函数里面的for循环有关系。有什么想法吗?
这是我的代码:
#!/usr/local/bin/python
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
fig = plt.figure()
#Build the basemap
antmap = Basemap(projection='spstere', boundinglat=30, lon_0=-60, resolution='f')
antmap.drawcoastlines(color='black', linewidth=0.15)
antmap.bluemarble()
eq_data = open('eq_data')
lats, lons = [], []
mag = []
x,y = antmap(0,0)
point = antmap.plot(x,y,'ro', markersize=5)[0]
def init():
point.set_data([],[])
return point,
# Begin Animation
def animate(i):
for i, line in enumerate(eq_data.readlines()):
lats.append(float(line.split(',')[0]))
lons.append(float(line.split(',')[1]))
mag.append(float(line.split(',')[2]))
x,y = antmap(lons, lats)
point.set_data(x, y)
return point,
# antmap.plot(x,y, 'ro', markersize=8)
ani = animation.FuncAnimation(fig, animate, init_func=init, interval=500, blit=False)
plt.show()
我将如何为这些点设置动画?到目前为止,我还没有在网上找到任何其他能够为这些地震震中制作动画的东西。谢谢。
更新和更正的脚本
#!/usr/local/bin/python
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import numpy as np
# Create the Figure
fig = plt.figure()
#Build the basemap
antmap = Basemap(projection='spstere', boundinglat=30, lon_0=-60, resolution='l')
antmap.drawcoastlines(color='black', linewidth=0.15)
#antmap.bluemarble()
eq_data = open('eq_data')
lats, lons = [], []
mag = []
x,y = antmap(lons,lats)
for i, line in enumerate(eq_data.readlines()):
lats.append(float(line.split(',')[0]))
lons.append(float(line.split(',')[1]))
mag.append(float(line.split(',')[2]))
eq_data.close()
antmap.plot(x,y,'ro', markersize=5)
# Begin Animation
def animate(i):
x,y = antmap(lons[i], lats[i])
antmap.plot(x,y,'ro', markersize=8)
animation = FuncAnimation(fig, animate, interval=100, blit=False)
plt.show()
请您参考如下方法:
我认为您想在 animate 函数之外构建您的 lats 和 lons 列表,然后在内部一次绘制一个点函数。
animate 以递增的 i 顺序调用,因此我们可以使用它来索引 lons 和 lats 列表。
(注意,我还没有测试过这个,但我认为它应该可以工作)
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
fig = plt.figure()
#Build the basemap
antmap = Basemap(projection='spstere', boundinglat=30, lon_0=-60, resolution='f')
antmap.drawcoastlines(color='black', linewidth=0.15)
antmap.bluemarble()
eq_data = open('eq_data')
lats, lons = [], []
mag = []
x,y = antmap(0,0)
point = antmap.plot(x,y,'ro', markersize=5)[0]
# Read the data and build the lists of coordinates here
for i, line in enumerate(eq_data.readlines()):
lats.append(float(line.split(',')[0]))
lons.append(float(line.split(',')[1]))
mag.append(float(line.split(',')[2]))
eq_data.close()
def init():
point.set_data([],[])
return point,
# Begin Animation
def animate(i):
x,y = antmap(lons[i], lats[i])
point.set_data(x, y)
return point,
ani = animation.FuncAnimation(fig, animate, init_func=init, interval=500, blit=False)
plt.show()
