I have a numpy array whose elements are updated in a for loop:
a = np.array([[1,2,3],[4,5,6],[7,8,9]]) for t in range(0,10): imshow(a) for i in range(0,a.shape): for j in range(0,a.shape): a[i][j] += 1
I want to display the array at each iteration, but imshow() doesn’t work, it just displays the image once the loop terminates.
ps. I’m using an Ipython notebook
I found different things on the web but none of them work on my computer (for example I tried to use matplotlib’s animation module)
The strange thing is that if I try to execute this example (http://matplotlib.org/examples/animation/dynamic_image2.html) using the standard python prompt everything works fine, while on the Ipython notebook it doesn’t work. Can anyone explain me why?
Maybe I oversimplified my code;
I’m working on a forest-fire model, the array is a grid filled with 0 = empty site, 1 = tree, 2 = fire.
At each time step (iteration):
I want to display the array using a colormap to visualize the evolution of my model
imshow(a) will plot the values of the array a as pixel values, but it won’t display the plot. To view the image after each iteration of the for loop, you need to add
This should do what you want:
from matplotlib.pyplot import imshow, show a = np.array([[1,2,3],[4,5,6],[7,8,9]]) for t in range(0,10): imshow(a) show() for i in range(0,a.shape): for j in range(0,a.shape): a[i][j] += 1
For me just using
show() doesn’t always work, and when it does, things tend to get very slow over time. To handle these problems, I import
display and use its
import numpy as np import matplotlib.pyplot as plt from IPython import display import time pause_time = 0.2 # seconds between frames a = np.random.rand(3,3) for t in range(0,10): plt.imshow(a) plt.title(t) display.display(plt.gcf()) display.clear_output(wait=True) time.sleep(pause_time) a = np.random.rand(3,3)
The above is adapted from this answer. The
time module is used just to let you pause the display and control the frame rate to the level you want: it is optional.