2

I cannot for the life of me figure out how to animate points (earthquake epicenters) on a Matplotlib basemap plot, using the animation function. I have tried implementing this example code into my script, but all my points plot at once. It may have something to do with my function and the for loop within the function. Any thoughts?

Here is my code:

#!/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()

How would I animate these points? I haven't been able to find anything else online thus far that has been able to animate these earthquake epicenters. Thanks.

UPDATED AND CORRECTED SCRIPT

#!/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()
Community
  • 1
  • 1
geeb.24
  • 527
  • 2
  • 7
  • 25

1 Answers1

3

I think you want to build your lats and lons lists outside of the animate function, then just plot one point at a time inside the function.

animate is called sequentially with an increasing i, so we can use that to index the lons and lats lists.

(Note, I haven't tested this, but I think it should work)

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()
tmdavison
  • 64,360
  • 12
  • 187
  • 165
  • tom, Thanks for your help with this. This solution worked! Expanding on this code, I was wondering if you had an idea about how to keep the points from disappearing after they're plottted, so that once the animation is complete, all the points (or epicenters) are on the map. As this code is written right now, a point is plotted, then it's removed when the next point is plotted. Thanks again for your help. – geeb.24 Sep 11 '15 at 16:10
  • Nevermind, I figured it out! I'll update my original script with my edits. Thanks, Tom. – geeb.24 Sep 11 '15 at 16:15