我一般对Python和程序设计还很陌生,但是我仍然希望我的问题可以解决,因为到目前为止我还没有找到足够的答案。
我的基本练习是根据给定的虚构数据集创建一个地球和木星轨道的小动画。这个动画是非常基本的(基本上是指一些彩球绕圈运动)。
现在,我已经使用matplotlib.animation.FuncAnimation模块来创建动画,并且效果非常好并且符合预期。当我尝试保存动画时出现问题。保存过程比原始创建的动画要慢得多,并且随着进度的进行而变得越来越慢,几乎可以完全停止任务。
现在我的猜测是,由于数据集非常大(10000点),并且save(...)连续地将帧彼此叠加,因此对于程序来说,它很快变得难以处理。
这是到目前为止,到目前为止,但是我还没有找到解决该问题的方法。同样,我对编程的知识非常有限,但我仍然希望有解决方案。
注意:此代码将需要运行指定的“ orbits.out”文件。我也可以尝试使它可用,但是也许没有必要。
我在Windows 10上使用Anaconda并使用Microsoft Visual Studio Code(如果相关)进行编码
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib.animation import FuncAnimation as ani
#read out basic information before reading out the data set
fileHandle = open("orbits.out")
basedata = fileHandle.read(41) #41
fileHandle.close()
#numpy array with the columns: t xSun ySun xEarth yEarth xJupiter yJuptier
dataset = np.loadtxt("orbits.out", skiprows = 5,
usecols = (0,1,2,4,5,7,8))
#create a image with the starting positions for all points
fig, grid = plt.subplots()
sun_data = [dataset[0,1], dataset[0,2]]
earth_data = [dataset[0,3], dataset[0,4]]
jupiter_data = [dataset[0,5], dataset[0,6]]
#create separate elements to use different colors and sizes
sun, = grid.plot(sun_data[0], sun_data[1], "yo",
markersize = 20, animated = True,
label = "Sun")
earth, = grid.plot(earth_data[0], earth_data[1], "bo",
markersize = 10, animated = True,
label = "Earth")
jupiter, = grid.plot(jupiter_data[0], jupiter_data[1], "mo",
markersize = 15, animated = True,
label = "Jupiter")
grid.legend(loc = "upper left")
def init():
grid.set_xlim(-6.5, 6.5)
grid.set_ylim(-6.5, 6.5)
return sun, earth, jupiter,
def system(frame):
f = frame
print("step number:", f)
#update the positions
sun.set_data(dataset[f,1], dataset[f,2])
earth.set_data(dataset[f,3], dataset[f,4])
jupiter.set_data(dataset[f,5], dataset[f,6])
return sun, earth, jupiter,
draw = ani(fig, system, frames = np.arange(1, len(dataset[:,0])),
init_func = init, blit = True, interval = 30,
repeat_delay = 0)
plt.show()
draw.save("orbits.gif", writer = "imagemagick")