Some questions regarding pcolor(mesh)/nbagg/FuncAnimate

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 “”, 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

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?

  1. 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?

  2. 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

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 <rnelsonchem@…287…> 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?
  1. 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 “”, 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

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?

  1. 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?
  1. 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@…1735…sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

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 <tcaswell@…287…> 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 <rnelsonchem@…287…> 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?
  1. 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 “”, 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

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?

  1. 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?
  1. 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@…1735…sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

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 Sat, Apr 11, 2015 at 8:35 PM, Thomas Caswell <tcaswell@…287…> 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 <rnelsonchem@…287…> 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?
  1. 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 “”, 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

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?

  1. 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?
  1. 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@…1735…sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

animation objects have a private _stop() method. That might have to be a workaround.

···

On Sun, Apr 12, 2015 at 9:24 AM, Thomas Caswell <tcaswell@…287…> 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 <rnelsonchem@…287…> 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


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

On Sat, Apr 11, 2015 at 8:35 PM, Thomas Caswell <tcaswell@…287…> 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 <rnelsonchem@…287…> 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?
  1. 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 “”, 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

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?

  1. 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?
  1. 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@…1735…sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

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:

···

On Sun, Apr 12, 2015 at 9:24 AM, Thomas Caswell <tcaswell@…287…> 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 <rnelsonchem@…287…> 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 <tcaswell@…287…> 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 <rnelsonchem@…287…> 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?
  1. 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 “”, 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

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?

  1. 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?
  1. 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@…1735…sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

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 <rnelsonchem@…287…> 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


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

On Sun, Apr 12, 2015 at 9:24 AM, Thomas Caswell <tcaswell@…287…> 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 <rnelsonchem@…287…> 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 <tcaswell@…287…> 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 <rnelsonchem@…287…> 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?
  1. 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 “”, 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

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?

  1. 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?
  1. 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@…1735…sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

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.root@…1304…> 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 <rnelsonchem@…1896…> 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


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

On Sun, Apr 12, 2015 at 9:24 AM, Thomas Caswell <tcaswell@…287…> 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 <rnelsonchem@…287…> 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 <tcaswell@…287…> 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 <rnelsonchem@…287…> 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?
  1. 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 “”, 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

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?

  1. 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?
  1. 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@…1735…sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

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 9:30 AM, Benjamin Root <ben.root@…1304…> 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 <rnelsonchem@…287…> 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


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

On Sun, Apr 12, 2015 at 9:24 AM, Thomas Caswell <tcaswell@…287…> 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 <rnelsonchem@…287…> 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 <tcaswell@…287…> 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 <rnelsonchem@…287…> 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?
  1. 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 “”, 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

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?

  1. 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?
  1. 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@…1735…sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users