I am working on my orbit program, and I have currently only animated the moon with a downward (-y) velocity of -1023. The animation works, but each frame stays on the figure when the next one comes on:
Here is my code:
import numpy as np
import matplotlib.pyplot as plt
import math
import matplotlib.animation as animation
er = 6378100*10#m #earth radius
mr = 1737400*10#m #moon radius
em = 5.97219*10**24#kg #earth mass
mm = 7.34767309*10**22#kg #moon mass
d = 384400000#m #distance earth-moon
G = 6.67384*10**(-11) #gravity constant
mv = -1023#m/s #Moon velocity
nts = 10000 #no. time steps
def circle(r, h, k, a):
x = r*math.cos(a)+h
y = r*math.sin(a)+k
plt.scatter(x,y)
def simData():
tmax = 10000*nts
ts = 10000
x = 0.0
t = 0.0
while t < tmax:
n = 0
for i in range(120):
circle(mr, d, mv*t, n)
n = n + math.pi/60
t = t + ts
yield x, t
def simPoints(simData):
x, t = simData[0], simData[1]
time_text.set_text(time_template%(t))
line.set_data(t, x)
return line, time_text
fig = plt.figure()
ax = plt.axes(xlim=(-430000000, 430000000), ylim=(-430000000, 430000000))
line, = ax.plot([], [], 'bo', ms=10)
time_template = 'Time = %.1f s' # prints running simulation time
time_text = ax.text(0.05, 0.9, '', transform=ax.transAxes)
ani = animation.FuncAnimation(fig, simPoints, simData, blit=False,\
interval=10, repeat=True)
plt.show()
解决方案
The answer is simple: matplotlib animation does not wipe the image between frames. The point is that you yourself have to change the properties of the objects on the screen. Now you instead plot a new image with some new objects when you do the plt.scatter in circle.
I changed a few lines in your code to avoid adding new objects, see the comment lines marked with ####. Now it should be a bit snappier. (Even though the Moon is escaping Earth's gravitational field. Pity.)
import numpy as np
import matplotlib.pyplot as plt
import math
import matplotlib.animation as animation
er = 6378100*10#m #earth radius
mr = 1737400*10#m #moon radius
em = 5.97219*10**24#kg #earth mass
mm = 7.34767309*10**22#kg #moon mass
d = 384400000#m #distance earth-moon
G = 6.67384*10**(-11) #gravity constant
mv = -1023#m/s #Moon velocity
nts = 10000 #no. time steps
def circle(r, h, k, a):
x = r*math.cos(a)+h
y = r*math.sin(a)+k
#### CHANGED
moony.center = x,y
def simData():
tmax = 10000*nts
ts = 10000
x = 0.0
t = 0.0
while t < tmax:
n = 0
for i in range(120):
circle(mr, d, mv*t, n)
n = n + math.pi/60
t = t + ts
yield x, t
def simPoints(simData):
x, t = simData[0], simData[1]
time_text.set_text(time_template%(t))
line.set_data(t, x)
return line, time_text
fig = plt.figure()
ax = plt.axes(xlim=(-430000000, 430000000), ylim=(-430000000, 430000000))
#### CHANGED: a grey circle of moony dimensions to be moved around
moony = plt.Circle((0,0), mr, facecolor=(.8,.8,.8))
ax.add_artist(moony)
time_template = 'Time = %.1f s' # prints running simulation time
time_text = ax.text(0.05, 0.9, '', transform=ax.transAxes)
ani = animation.FuncAnimation(fig, simPoints, simData, blit=False,\
interval=10, repeat=True)
plt.show()
Of course, you'll probably want to create a circle to illustrate Earth, as well. You do not need to have any plt.plot commands in the file if you just want to plot two objects.