Я пытаюсь создать анимацию в этом видео , используя Python.Но я застрял на самом первом шаге.До сих пор я создал Круг и точку, вращающуюся по его окружности.Мой код приведен ниже.Теперь я хочу построить значения y
, соответствующие x=np.arange(0, I*np.pi, 0.01)
вдоль оси x (как показано в функции update()
в коде).Для этого я должен определить другую функцию, чтобы построить эти x
и y
и передать эту функцию внутри нового animation.FuncAnimation()
.
Есть ли способ построить все, используя только функцию update()
?
Примечание Я нашел код этой анимации в здесь ,Но он написан на Java!
Мой код
import matplotlib.pyplot as plt
from matplotlib import animation
import numpy as np
W = 6.5
H = 2
radius = 1
I = 2
T = 3
N = 2
plt.style.use(['ggplot', 'dark_background'])
def create_circle(x, y, r):
circle = plt.Circle((x, y), radius=r, fill=False, alpha=0.7, color='w')
return circle
def create_animation():
fig = plt.figure()
ax = plt.axes(xlim=(-2, W + 2), ylim=(-H, H))
circle = create_circle(0, 0, radius)
ax.add_patch(circle)
line1, = ax.plot(0, 1, marker='o', markersize=3, color='pink', alpha=0.7)
def update(theta):
x = radius * np.cos(theta)
y = radius * np.sin(theta)
line1.set_data([0, x], [0, y])
return line1,
anim = []
anim.append(animation.FuncAnimation(fig, update,
frames=np.arange(0, I * np.pi, 0.01),
interval=10, repeat=True))
# anim.append(animation.FuncAnimation(fig, update_line, len(x),
# fargs=[x, y, line, line1], interval=10))
plt.grid(False)
plt.gca().set_aspect('equal')
plt.gca().spines['left'].set_visible(False)
plt.gca().spines['top'].set_visible(False)
plt.gca().spines['right'].set_visible(False)
plt.gca().spines['bottom'].set_visible(False)
plt.gca().set_xticks([])
plt.gca().set_yticks([])
plt.show()
if __name__ == '__main__':
create_animation()
Редактировать. Я улучшил задачу, определив глобальную переменную pos
и изменение функции update()
следующим образом ... Анимация теперь выглядит лучше, но все еще с ошибками!
Улучшенная часть
plot, = ax.plot([], [], color='w', alpha=0.7)
level = np.arange(0, I * np.pi, 0.01)
num = []
frames = []
for key, v in enumerate(level):
num.append(key)
frames.append(v)
def update(theta):
global pos
x = radius * np.cos(theta)
y = radius * np.sin(theta)
wave.append(y)
plot.set_data(np.flip(level[:pos] + T), wave[:pos])
line1.set_data([0, x], [0, y])
pos += 1
return line1, plot,
Редактировать До сих пор я сделал следующее:
def update(theta):
global pos
x, y = 0, 0
for i in range(N):
prev_x = x
prev_y = y
n = 2 * i + 1
rad = radius * (4 / (n * np.pi))
x += rad * np.cos(n * theta)
y += rad * np.sin(n * theta)
wave.append(y)
circle = create_circle(prev_x, prev_y, rad)
ax.add_patch(circle)
plot.set_data(np.flip(level[:pos] + T), wave[:pos])
line2.set_data([x, T], [y, y])
line1.set_data([prev_x, x], [prev_y, y])
pos += 1
return line1, plot, line2,
Выход
Пожалуйста, помогите исправитьэта анимация.Или есть какой-нибудь эффективный способ сделать эту анимацию?
Edit Хорошо, теперь анимация частично работает.Но есть небольшая проблема: в моем коде (внутри определения update()
) я должен добавить круги с центром в (prev_x, prev_y)
радиуса, определенного как rad
для каждого кадра.По этой причине я пытаюсь использовать for loop
в определении update()
, но тогда все круги остаются на рисунке (см. Вывод ниже).Но я хочу один круг в каждом кадре с центром и радиусом, как указано выше.Также та же проблема с plot
.Я пытаюсь использовать ax.clear()
внутри for loop
, но это не сработало.