|
From: Ryan N. <rne...@gm...> - 2015-04-10 18:58:21
|
Good afternoon, all!
I'm really digging the nbagg backend, and I'm trying to use it to make an
animation. As the subject suggests, though, I'm having some issues with
these features. I'm using Python 3.4, Matplotlib 1.4.3, and IPython 3.1.
Below is a small code sample that emulates my system. The pcolor call can
be substituted for pcolormesh, and I see the same behavior. (Sorry this is
a bit long. I tried to break it up as best as possible.)
#############
#import matplotlib
#matplotlib.use('nbagg')
#%matplotlib nbagg
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animate
class Testing(object):
def __init__(self, ):
self.fig = plt.figure()
array = np.random.rand(4,5)
#array = np.zeros((4,5))
self.pc = plt.pcolor(array, edgecolor='k', linewidth=1.)
self.points = [plt.scatter(np.random.rand(), np.random.rand())]
def update(self, iter_num):
array = np.random.rand(4*5)
self.pc.set_array(array)
for point in self.points:
point.remove()
self.points = [plt.scatter(np.random.rand(), np.random.rand())]
test = Testing()
animate.FuncAnimation(test.fig, test.update, interval=1000, blit=False)
plt.show()
###############
1. As is, this code runs fine with a Qt backend. It also runs fine as a
first call in a notebook if the `show` call is commented out and the
`%matplotlib` line is uncommented. However, if the `show` call is left in
and the `matplotlib.use` call is uncommented, then the pcolor array
changes, but the scatterpoint only shows on the first update and then
disappears forever. What is the difference between these two invocations?
2. With the `%matplotlib` magic uncommented and `show` removed, the first
invocation of this as a cell works fine. Closing the figure (with the red
X) and running the cell again shows two scatter plot points. Running it a
third time shows three scatter plot points. If you call `plt.clf` in the
next cell, I get a series of errors as follows:
_____
ERROR:tornado.application:Exception in callback <bound method
TimerTornado._on_timer of <matplotlib.backends.backend_nbagg.TimerTornado
object at 0x7f894cb10f98>>
Traceback (most recent call last):
File "/usr/lib64/python3.4/site-packages/tornado/ioloop.py", line 976, in
_run
return self.callback()
File "/usr/lib64/python3.4/site-packages/matplotlib/backend_bases.py",
line 1290, in _on_timer
ret = func(*args, **kwargs)
File "/usr/lib64/python3.4/site-packages/matplotlib/animation.py", line
925, in _step
still_going = Animation._step(self, *args)
File "/usr/lib64/python3.4/site-packages/matplotlib/animation.py", line
784, in _step
self._draw_next_frame(framedata, self._blit)
File "/usr/lib64/python3.4/site-packages/matplotlib/animation.py", line
803, in _draw_next_frame
self._draw_frame(framedata)
File "/usr/lib64/python3.4/site-packages/matplotlib/animation.py", line
1106, in _draw_frame
self._drawn_artists = self._func(framedata, *self._args)
File "<ipython-input-2-f9290d8f6154>", line 22, in update
point.remove()
File "/usr/lib64/python3.4/site-packages/matplotlib/artist.py", line 139,
in remove
self._remove_method(self)
File "/usr/lib64/python3.4/site-packages/matplotlib/axes/_base.py", line
1479, in <lambda>
collection._remove_method = lambda h: self.collections.remove(h)
ValueError: list.remove(x): x not in list
______
Why does this happen? Is there a way to close the animation cleanly?
3. If I uncomment the `np.zeros` call, the pcolor array never updates
irrespective of the backend. I see the same behavior with `np.ones` as
well, even if the dtype is set to `float`. Is there are a way to start with
a all-zero pcolor that allow dynamic updates?
4. I'd like to be able to have the animation run until a certain condition
is met. Is there a way to code a clean break for the animation?
As always, any help is most appreciated!
Ryan
|