Skip to main content
 首页 » 编程设计

python之Matplotlib basemap 绘制纬度/经度

2024年08月25日28oomusou

我终其一生都无法弄清楚如何使用动画功能在 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()