Как создать график координат dim-3, который меняется со временем (итеративный график или анимация)? - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь построить N-Body Simulation. Координаты каждого тела (данные N тел) обновляются после каждого итерационного шага по времени. Например, позиционные координаты для каждого из 3 тел приведены ниже для 2 (из 10e4) временных шагов; первый, второй и третий столбцы соответствуют координатам x, y и z соответственно, тогда как каждая строка представляет уникальное тело:

*- STEP #0:

INITIAL POSITIONS:
[[ 0.  0.  0.]
 [10. 10. 10.]
 [11. 11. 11.]]

FINAL POSITIONS:
[[2.34593746e-11 2.34593746e-11 2.34593746e-11]
 [1.00000000e+01 1.00000000e+01 1.00000000e+01]
 [1.10000000e+01 1.10000000e+01 1.10000000e+01]]

*- STEP #1:

INITIAL POSITIONS:
[[2.34593746e-11 2.34593746e-11 2.34593746e-11]
 [1.00000000e+01 1.00000000e+01 1.00000000e+01]
 [1.10000000e+01 1.10000000e+01 1.10000000e+01]]

FINAL POSITIONS:
[[7.03781237e-11 7.03781237e-11 7.03781237e-11]
 [1.00000000e+01 1.00000000e+01 1.00000000e+01]
 [1.10000000e+01 1.10000000e+01 1.10000000e+01]]

*- STEP #2:

INITIAL POSITIONS:
[[7.03781237e-11 7.03781237e-11 7.03781237e-11]
 [1.00000000e+01 1.00000000e+01 1.00000000e+01]
 [1.10000000e+01 1.10000000e+01 1.10000000e+01]]

FINAL POSITIONS:
[[1.40756247e-10 1.40756247e-10 1.40756247e-10]
 [1.00000000e+01 1.00000000e+01 1.00000000e+01]
 [1.10000000e+01 1.10000000e+01 1.10000000e+01]]

Я хотел бы увидеть графическое представление этих данных.

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

def propagate_in_time(self):
    """ """
    for ith_step in range(self.nsteps):
        # print("\n*- STEP #{}:\n".format(ith_step))
        # print("\nINITIAL POSITIONS:\n{}\n".format(self.position))
        self.update_acceleration()
        self.update_velocity()
        self.update_displacement()
        self.update_position()
        # print("\nFINAL POSITIONS:\n{}\n".format(self.position))

Поэтому, пытаясь создать трехмерный график этих координат, я имею в виду создать экземпляр фигуры вне цикла for, построить график внутри цикла for и показать график вне цикла for как показано в этом примере . Моя попытка ниже:

def propagate_in_time(self, facecolors=('k', 'orange', 'yellow'):
    """ """
    fig, ax = plt.subplots()
    for body, facecolor in zip(self.celestial_bodies, facecolors):
        ax.plot(body.position, color=facecolor)
    for ith_step in range(self.nsteps):
        ax = fig.add_subplot(111)
        self.update_acceleration()
        self.update_velocity()
        self.update_displacement()
        self.update_position()
        for pos, facecolor in zip(self.position, facecolors):
            ax.plot(pos, color=facecolor)
    plt.show()

Хотя каждый position в self.position является плоским массивом, состоящим из 3 элементов, полученный мной график выходных данных (из всех временных шагов) показан ниже.

enter image description here

Я нахожу это странным, потому что я обязательно включил следующий импорт.

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

Итак, главный вопрос:

Как я могу получить dim-3 график этих данных? Кроме того, есть ли лучшие способы визуализации этих данных?

Вторичный / менее важный вопрос:

Предположим, что z-компонент каждой позиции был 0. Изменит ли это метод, который вы бы использовали для визуализации данных?

...