From: Thomas C. <tca...@gm...> - 2015-04-12 13:24:31
|
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 <rne...@gm...> 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 <tca...@gm...> > 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 <rne...@gm...> >> 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 >>> Mat...@li... >>> https://lists.sourceforge.net/lists/listinfo/matplotlib-users >>> >> > |