2015-01-14 2 views
3

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

Проблема: отображаемый график полностью пуст. Однако, если я закомментирую возврат time_text (т. Е. Измените «return patches, time_text» на «return patches»), все будет работать нормально. Я предполагаю, что проблема заключается в том, как я обновляю time_text, но я зациклился на том, как это исправить.


from matplotlib import pyplot as plt 
from matplotlib import animation 
import numpy as np 
import pandas as pd 

box_size = 50 
radius = 1 

df =pd.DataFrame(np.array([np.arange(50),np.arange(50),np.arange(50)]).T, 
          columns = ['x','y','frame']) 

#set up the figure 
fig = plt.figure() 
plt.axis([0,box_size,0,box_size]) 
ax = plt.gca() 
ax.set_aspect(1) 
time_text = ax.text(5, 5,'') 

#initialization of animation, plot empty array of patches 
def init(): 
    time_text.set_text('initial') 
    return [] 

def animate(i): 
    patches = [] 
    #data for this frame only 
    data = df[df.frame == i] 
    time_text.set_text('frame'+str(i)) 
    #plot circles at particle positions 
    for idx,row in data.iterrows(): 
     patches.append(ax.add_patch(plt.Circle((row.x,row.y),radius,color= 'b', 
               alpha = 0.5)))    
    return patches, time_text 

anim = animation.FuncAnimation(fig, animate, init_func=init, repeat = False, 
           frames=int(df.frame.max()), interval=50, 
           blit=True) 
+0

Возможно [этот вопрос] (https://stackoverflow.com/questions/44594887/how-to-update-plot-title-with-matplotlib-using-animation) может помочь. – ImportanceOfBeingErnest

ответ

-1

Вам нужно будет, чтобы ваша функция инициализации возвращает pyplot.text объект. Вы также должны инициировать объект, который вы хотите изменить при каждом вызове, из функции anim.

Посмотрите на ArtistAnimation, это может быть лучше подходит для того, что вы делаете.

Чтобы избежать множества кругов на холсте, я предпочел бы обновить положение объекта пути вместо добавления новых на каждой итерации.

from matplotlib import pyplot as plt 
import matplotlib.patches as patches 
from matplotlib import animation 
import numpy as np 
import pandas as pd 

box_size = 50 
radius = 1 

df = pd.DataFrame(np.array([np.arange(50),np.arange(50),np.arange(50)]).T, 
          columns = ['x','y','frame']) 

#set up the figure 
fig = plt.figure() 
plt.axis([0,box_size,0,box_size]) 
ax = plt.gca() 
time_text = ax.text(5, 5,'') 

circle = plt.Circle((1.0,1.0), radius,color='b', alpha=0.5, facecolor='orange', lw=2) 


#initialization of animation, plot empty array of patches 
def init(): 
    time_text.set_text('initial') 
    ax.add_patch(circle) 
    return time_text, ax 

def animate(i): 
    #data for this frame only 
    data = df[df.frame == i] 
    time_text.set_text('frame' + str(i)) 

    #plot circles at particle positions 
    for idx,row in data.iterrows(): 
     circle.center = row.x,row.y 

    return time_text, ax 

anim = animation.FuncAnimation(fig, animate, init_func=init, repeat = False, 
           frames=int(df.frame.max()), interval=200, blit=True) 

plt.show() 
+0

@mdriscoll Добро пожаловать в переполнение стека. Обратите внимание, что мое решение представляет проблему, вам нужно будет найти способ удаления старых путей при добавлении новых. –

+0

Функция init() return time_text, к сожалению, не помогает - она ​​по-прежнему возвращает пустой сюжет без анимации. Есть ли kwarg в FuncAnimation? Мне не хватает? – mdriscoll

+0

Он должен возвращать как минимум 2 объекта, так как метод ожидает итерации. Вот почему я вернул «matplotlib.axes.AxesSubplot». Модифицированный код, который я опубликовал, показывает анимацию с меняющимся текстом на обоих моих компьютерах, пытались ли вы ее запустить? –

Смежные вопросы