2016-12-29 6 views
0

Я имею немного неприятности с matplotlib.animation в коде показано ниже:Создания Matplotlib анимации из plt.imshow в тройном цикл

# creates grid of 1's/-1's of dimensions specified. 
arr1 = np.random.choice([1.,-1.],[xarray,yarray]) 

# arr will be the 2-d array iterated. 
arr = arr1 

# time, row and column loops. 
for t in range(0,time1): 
    for i in range(0,x): 
     for j in range(0,y): 

      Echange=energy_change(arr,i,j) # change in energy for this flip. 
      P_flip = np.exp(-Echange/kT) # probability of this flip occurring. 

      if random.random() < P_flip: # condition to accept flip. 
       arr[i][j]=-1*arr[i][j] 

    image = plt.imshow(arr) # plots image of Ising model after (time) iterations. 

    if t==0: 
     plt.show() 
    else: 
     plt.draw() 

Я удалил мою попытку анимации для ясности. В принципе, я хочу сделать оконную анимацию, которая останавливается после указанного времени, без какого-либо отставания от вычисления. (Выполнение этого кода показывает анимацию, но не является последовательной или плавной). Есть ли способ вычислить все итерации, а затем отобразить анимированное окно? Я был бы благодарен за любой вклад!

ответ

1

Конечно, вполне возможно отделить расчет от анимации. Одним из вариантов является создание большого массива, первые два измерения которого содержат сетку, а последнее - временную метку. Затем можно сначала заполнить массив, а затем нарисовать его в анимации.

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

N = 10 
T = 100 
a = np.zeros((N,N,T)) 
# creates grid of 1's/-1's of dimensions specified. 
a[:,:,0] = np.random.choice([1.,-1.],(N,N)) 

# time, row and column loops. 
for t in range(1,T): 
    a[:,:,t] = a[:,:,t-1] 
    for i in range(0,N): 
     for j in range(0,N): 
      P_flip = 0.3 
      if np.random.random() < P_flip: # condition to accept flip. 
       a[i,j,t]=-1*a[i,j,t] 


#### Plotting ##### 
fig = plt.figure() 
im = plt.imshow(a[:,:,0], interpolation="none", cmap="Blues") 
title = plt.title("") 

def update(t): 
    im.set_array(a[:,:,t]) 
    title.set_text(str(t)) 

ani = matplotlib.animation.FuncAnimation(fig, func=update, frames=T, 
         repeat=False, interval=100) 
plt.show() 

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

  • Нет связанных вопросов^_^