|
From: Thomas C. <tca...@gm...> - 2015-04-16 18:16:21
|
The 'animated' property is used _deep_ with in `axes.draw` ( https://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/axes/_base.py#L2035) to skip artists with the 'animated' flag set. This makes them play nice with blitting (which explicitly uses `axes.draw_artist`) so they are not drawn on a call to `ax.draw` (which sets up the background canvas). Sorry, I should not have included them with out a good explanation, I was feeling too fancy with that example. Tom On Thu, Apr 16, 2015 at 11:27 AM Ryan Nelson <rne...@gm...> wrote: > Ben, > > Sorry. I probably should have just dropped that entirely. In my code > sample, it is actually commented out because it breaks the animation with > the nbagg backend. It was in Tom's example, so I left it in because I > wanted to find out what it was doing. > > Ryan > > On Thu, Apr 16, 2015 at 9:30 AM, Benjamin Root <ben...@ou...> wrote: > >> I just noticed your use of "animated=True". I have had trouble using that >> in the past with the animation module. It is a leftover from the days >> before the animation module and isn't actually used by it, IIRC. Try not >> supplying that argument. >> >> On Thu, Apr 16, 2015 at 8:18 AM, Ryan Nelson <rne...@gm...> >> wrote: >> >>> 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 <tca...@gm...> >>> 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 <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 >>>>>>> >>>>>> >>>>> >>> >>> >>> ------------------------------------------------------------------------------ >>> 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 >>> >>> >> > |