Сохранение анимации matplotlib занимает слишком много времени - PullRequest
0 голосов
/ 08 декабря 2018

Я довольно плохо знаком с Python и программированием в целом, но все еще надеюсь, что моя проблема может быть исправлена, так как я до сих пор не нашел достаточного ответа.

Моё основное упражнение - создатьнебольшая анимация орбит Земли и Юпитера на основе заданного вымышленного набора данных.Эта анимация очень простая (имеется в виду несколько цветных шариков, движущихся по кругу).

Теперь я использовал модуль matplotlib.animation.FuncAnimation для создания анимации, и он работал очень хорошо и по назначению.Проблема возникает, когда я пытаюсь сохранить анимацию.Процесс сохранения намного медленнее, чем первоначально созданная анимация, и чем дальше он продвигается, тем медленнее, почти полностью останавливаясь на пути к задаче.

Теперь я предполагаю, что, поскольку набор данных очень большой (10000точки) и функция сохранения (...) постоянно накладывает кадры друг на друга, это быстро становится слишком большим, чтобы справиться с программой.

Это примерно столько, сколько я получил до сих пор, но у меня нетне нашел ничего, чтобы решить проблему.Опять же, мои знания в области программирования весьма ограничены, но я все еще надеюсь, что есть решение.

ПРИМЕЧАНИЕ: этот код потребовал бы для запуска указанного файла "orbits.out".Я также могу попытаться сделать это доступным, но, возможно, в этом нет необходимости.

Я использую Anaconda в Windows 10 и код с кодом Microsoft Visual Studio (если это актуально)

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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...