I'd like to display a simple animation by calling imshow
in a for loop. Here's a demo of my problem:
import pylab,time
images = [pylab.uniform(0,255,(50,50)) for _ in xrange(40)]
pylab.ion()
timings = []
for img in images:
tic = time.time()
pylab.imshow(img)
pylab.draw()
toc = time.time()
timings.append(toc-tic)
pylab.clf()
pylab.plot(timings)
pylab.title('elapsed time per iteration')
pylab.ioff()
pylab.show()
Note that I generate the images before running the loop, and that the only parts I time are the imshow
and draw
functions. I'm getting results that look like this:
How can I avoid this slowdown?
Things are slowing down because you're adding more and more images and drawing them all each time.
Either 1) clear the plot between each image (In your case, pylab.cla()
), or better yet 2) don't make a new image, just set the data of the existing image to the new data.
As an example of using cla()
:
import matplotlib.pyplot as plt
import numpy as np
images = np.random.uniform(0, 255, size=(40, 50, 50))
fig, ax = plt.subplots()
fig.show()
for image in images:
ax.imshow(image)
fig.canvas.draw()
ax.cla()
And as an example of just setting the data:
import matplotlib.pyplot as plt
import numpy as np
images = np.random.uniform(0, 255, size=(40, 50, 50))
fig, ax = plt.subplots()
im = ax.imshow(images[0])
fig.show()
for image in images[1:]:
im.set_data(image)
fig.canvas.draw()
You'll notice that the second method is considerably faster.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With