Проблемы с анимацией трехмерного сюжета в питоне - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь анимировать кривую в 3D и у меня возникли некоторые проблемы. Я успешно анимировал некоторые вещи в 2D, поэтому я подумал, что знаю, что делаю. В приведенном ниже коде я параметрически генерирую значения x, y и z в виде спирали и проверил, что могу построить полную кривую в 3D. Чтобы начать анимацию кривой, я пытаюсь начать с построения только первых двух точек данных, а затем использовать FuncAnimation для обновления данных, чтобы они отображали большие части данных. Но, как я уже сказал, по какой-то причине это не работает, и я понятия не имею, почему; все, что я получаю, это начальный график с первыми двумя точками данных. Любая помощь будет оценена.

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

t_max = 10
steps = 100
t = np.linspace(0, t_max, steps)
x = np.cos(t)
y = np.sin(t)
z = 0.1*t

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
line, = ax.plot(x[0:1], y[0:1], z[0:1])

def update(i):
    line.set_xdata(x[0:i])
    line.set_ydata(y[0:i])
    line.set_zdata(z[0:i])
    fig.canvas.draw()

ani = animation.FuncAnimation(fig, update, frames=t, interval=25, blit=False)
plt.show()

1 Ответ

0 голосов
/ 02 ноября 2018

Хорошо, я наконец-то получил его на работу. У меня была глупая ошибка (frames = t), но я также понял, что вам нужно установить данные в функции обновления по-другому. Вот рабочий код на случай, если кому-то будет интересно.

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

t_max = 10
steps = 100
t = np.linspace(0, t_max, steps)
x = np.cos(t)
y = np.sin(t)
z = 0.1*t

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
line, = ax.plot([], [], [], lw=1)
ax.set_xlim(-1,1)
ax.set_ylim(-1,1)
ax.set_zlim(0,1)
plt.show()

def update(i):
    line.set_data(x[0:i], y[0:i])
    line.set_3d_properties(z[0:i])
    return

ani = animation.FuncAnimation(fig, update, frames=100, interval=10, blit=True)
plt.show()
...