Tom,
Thanks for the code. As it was given, I had to change `blit=True` in the
`FuncAnimation` call in order to get this to work in a regular Qt backend.
It did not work with the nbagg backend; however, if I used this code it
works fine:
####
%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.)#,
animated=True)
self.pc.set_clim([0, 1])
self.points = [plt.scatter(np.random.rand(), np.random.rand())]#,
animated=True)]
def update(self, iter_num):
array = np.random.rand(4*5)
self.pc.set_array(array)
for point in self.points:
point.set_offsets([np.random.rand(), np.random.rand()])
#return (self.pc, ) + tuple(self.points)
test = Testing()
ani = animate.FuncAnimation(test.fig, test.update, interval=250,
blit=False, frames=50)
plt.show()
####
Also this code solves the problem I was having with several scatter points
being displayed upon multiple runs of the same code cell.
I wasn't familiar with the "animated" keyword, and it is not well
documented yet. Can you give me a quick explanation of what it is doing?
Ben: thanks for the hint about the _stop() method. I might look into that
for my example.
Thank you all for your assistance. Things are working pretty much as I need
now!
Ryan
On Sun, Apr 12, 2015 at 9:24 AM, Thomas Caswell <tcasw...@gmail.com> wrote:
> You can
>
>
> ```
>
> #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.,
> animated=True)
>
> self.pc.set_clim([0, 1])
>
> self.points = [plt.scatter(np.random.rand(), np.random.rand(),
> animated=True)]
>
>
> def update(self, iter_num):
>
> array = np.random.rand(4*5)
>
> self.pc.set_array(array)
>
> for point in self.points:
>
> point.set_offsets([np.random.rand(), np.random.rand()])
>
>
> return (self.pc, ) + tuple(self.points)
>
>
>
> test = Testing()
>
> ani = animate.FuncAnimation(test.fig, test.update, interval=10,
> blit=False, frames=50)
>
> plt.show()
>
> ```
>
> note the addition of the `set_clim` line in the `__init__` method.
>
>
> You can also update the scatter artist in-place. The other changes will
> make it a bit for performant if you use bliting (which does not work with
> nbagg currently)
>
> Sorry I missed that part of the question first time through.
>
> Tom
>
> On Sun, Apr 12, 2015, 08:31 Ryan Nelson <rnelsonc...@gmail.com> wrote:
>
>> Tom,
>>
>> Thanks for the links. It does seem like fragments of my problem are
>> addressed in each of those comments, so I guess I'll have to wait for a bit
>> until those things get resolved. For now, I can just tell my students to
>> restart the IPython kernel each time they run the animation, which isn't
>> that hard. It's too bad that there isn't a 'stop' method now, but it's good
>> to hear that it isn't a completely terrible idea.
>>
>> I do still need help with Question #3 from my original email, though,
>> because it affects both the Qt and nbagg backends, and it is a bit of a
>> show stopper. I can't quite understand why initializing a pcolor(mesh) with
>> random numbers makes it possible to update the array in an animation, but
>> if you use all zeros or ones, it seems to be immutable.
>>
>> Ryan
>>
>> On Sat, Apr 11, 2015 at 8:35 PM, Thomas Caswell <tcasw...@gmail.com>
>> wrote:
>>
>>> Ryan,
>>>
>>> I have not looked at your exact issue yet, but there seems to be some
>>> underlying issues with animation and nbagg which we have not tracked down
>>> yet. See:
>>>
>>> https://github.com/matplotlib/matplotlib/pull/4290
>>> https://github.com/matplotlib/matplotlib/issues/4287
>>> https://github.com/matplotlib/matplotlib/issues/4288
>>>
>>> Running until a given condition is an interesting idea, but I think that
>>> means the animation objects needs to have a public 'stop' method first!
>>>
>>> Tom
>>>
>>> On Fri, Apr 10, 2015 at 3:00 PM Ryan Nelson <rnelsonc...@gmail.com>
>>> wrote:
>>>
>>>> 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
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> ------------------------------------------------------------
>>>> ------------------
>>>> BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT
>>>> Develop your own process in accordance with the BPMN 2 standard
>>>> Learn Process modeling best practices with Bonita BPM through live
>>>> exercises
>>>> http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual-
>>>> event?utm_
>>>> source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_
>>>> campaign=VA_SF_______________________________________________
>>>> Matplotlib-users mailing list
>>>> Matplotlib-users@lists.sourceforge.net
>>>> https://lists.sourceforge.net/lists/listinfo/matplotlib-users
>>>>
>>>
>>
------------------------------------------------------------------------------
BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT
Develop your own process in accordance with the BPMN 2 standard
Learn Process modeling best practices with Bonita BPM through live exercises
http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- event?utm_
source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users