Matplotlib Animation строит одно и то же для каждого кадра - PullRequest
1 голос
/ 26 апреля 2020

Я пытаюсь воссоздать анимацию в этом видео.

В настоящее время мой код отображается, но каждый кадр совпадает с последним. Я пытаюсь сначала построить вершины, а затем построить каждую точку по одной. Точки предварительно рассчитаны, поэтому все, что я хочу, это построить текущую точку и точки перед ней. Следующим шагом будет создание анимации (редактирование: т.е. gif или mp4), но это после того, как я смогу заставить эту часть работать.

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import numpy as np
import random

vertices = np.array([[0,0],
            [2,0],
            [1,2.5]])

dots = 100

def newPos(index, old_x, old_y):
    vertex_x = vertices[index][0]
    vertex_y = vertices[index][1]
    new_x = 0.5*(vertex_x + old_x)
    new_y = 0.5*(vertex_y + old_y)
    return([new_x,new_y])

global points
points = np.array([[0.25, 0.1]])

for i in range(dots-1):
    points = np.concatenate((points, [newPos(random.randint(0,2), points[i][0], points[i][1])]), axis = 0)

plt.figure()

global index
index = 0

def animate(i):
    plt.cla()

    global index
    index += 1

    plt.plot(vertices[0][0], vertices[0][1], 'o')

    global points
    plt.plot(points[0:index][0], points[0:index][1], 'o', color = '#1f77b4')

    plt.legend(['index = {0}'.format(index)], loc='upper left')

    plt.tight_layout()

while index < dots:
    ani = FuncAnimation(plt.gcf(), animate, interval=15000/dots)

    plt.title('Chaos Game with {0} Vertices and {1} Steps'.format(len(vertices), dots))

    plt.show()

1 Ответ

1 голос
/ 26 апреля 2020

Похоже, вы неправильно поняли, как работает matplotlib.animation.funcanimation , я настоятельно рекомендую вам взглянуть на некоторые из множества примеров, которые можно найти в Интернете. Давайте попробуем с этой версией следующее:

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
import random

vertices = np.array([[0,0],
                     [2,0],
                     [1,2.5],
                     [0,0]])

dots = 1000

# lower and higher bounds for x to be generated
int_lb = np.min(vertices[:,0])
int_hb = np.max(vertices[:,0])

def newPos(index, old_x, old_y):
    vertex_x = vertices[index][0]
    vertex_y = vertices[index][1]
    new_x = 0.5*(vertex_x + old_x)
    new_y = 0.5*(vertex_y + old_y)
    return([new_x,new_y])

# evaluating all your points
points = np.array([[0.25, 0.1]])
for j in range(dots-1):
    points = np.concatenate((points, [newPos(random.randint(int_lb,int_hb), points[j][0], points[j][1])]), axis=0)


fig = plt.figure()
ax = plt.gca()
ax.set_xlim([np.min(vertices[:,0])-0.05*np.max(vertices[:,0]),1.05*np.max(vertices[:,0])])
ax.set_ylim([np.min(vertices[:,1])-0.05*np.max(vertices[:,1]),1.05*np.max(vertices[:,1])])
ax.set_title('Chaos Game with {a} Vertices and {b} Steps'.format(a=len(vertices)-1, b=dots))
# draw boundaries
ax.plot(vertices[:,0],vertices[:,1],'k-', linewidth=1)
# initialize scatter object for current step and all evaluated dots
scat_curr = ax.scatter([], [], marker='X', s=15, c='black')
scat_dots = ax.scatter([], [], marker='o', s=5, c='#1f77b4',zorder=-1)

def init():
    scat_curr.set_offsets(np.c_[vertices[0,0], vertices[0,1]])
    scat_dots.set_offsets(np.c_[vertices[0,0], vertices[0,1]])
    return scat_curr, scat_dots

def animate(i):
    scat_curr.set_offsets(np.c_[points[i,0], points[i,1]])  
    scat_dots.set_offsets(np.c_[points[:i,0], points[:i,1]])  
    ax.legend([scat_curr],['iter i = {a}'.format(a=i)], loc='upper left')      
    return scat_curr, scat_dots

anim = animation.FuncAnimation(fig, animate, init_func=init, frames=dots, interval=10)

Writer = animation.writers['ffmpeg']
writer = Writer(fps=15, metadata=dict(artist='Me'), bitrate=1800)

anim.save('some_nice_triforces.mp4', writer=writer)

, что дает:

triforce

Если у вас есть какие-либо вопросы, я добавлю еще несколько комментариев, но так как это, в основном, ваша собственная работа, я уверен, что вы поймете, что то, что вы пробовали, было намного сложнее, чем должно было быть :). Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...