> > OK, types is a new part of the Python library for me, I'll have to go > learn about it. It looks like you basically just subclassed the > QuadContourSet object through a back door, by giving it the missing > method.
It's not a subclass, it's just a "monkey patch". I personally like "duck punching", because even just reading the term makes me laugh: "If it walks like a duck and quacks like a duck, it's a duck; or if it does not walk or talk like a duck, punch it until it does". In this case, we're punching the QuadContourSet until it behaves like an Artist. It's a useful technique for experimenting, and can be used as a patching technique in the interim until it is fixed properly. You never want to write code like this on a regular basis, however. > Your patch solves one of two animation problems, and I offer a > suggestion about how to fix the second (with questions). > > The program gets as far as ani.save() on line 29 without generating any > errors. An MP4 file showing animated contours is written to disk. The > origin of the contour plot is in the lower left, versus the upper left > of the original imshow() call, but that's expected. > > When you get to plt.show() on line 31, however: > > Traceback (most recent call last): > File > "/usr/local/lib/python2.6/dist-packages/matplotlib/backends/backend_gtk.py", > line 127, in _on_timer > TimerBase._on_timer(self) > File > "/usr/local/lib/python2.6/dist-packages/matplotlib/backend_bases.py", > line 1091, in _on_timer > ret = func(*args, **kwargs) > File "/usr/local/lib/python2.6/dist-packages/matplotlib/animation.py", > line 317, in _step > still_going = Animation._step(self, *args) > File "/usr/local/lib/python2.6/dist-packages/matplotlib/animation.py", > line 179, in _step > self._draw_next_frame(framedata, self._blit) > File "/usr/local/lib/python2.6/dist-packages/matplotlib/animation.py", > line 199, in _draw_next_frame > self._post_draw(framedata, blit) > File "/usr/local/lib/python2.6/dist-packages/matplotlib/animation.py", > line 222, in _post_draw > self._blit_draw(self._drawn_artists, self._blit_cache) > File "/usr/local/lib/python2.6/dist-packages/matplotlib/animation.py", > line 236, in _blit_draw > bg_cache[a.axes] = a.figure.canvas.copy_from_bbox(a.axes.bbox) > AttributeError: QuadContourSet instance has no attribute 'figure' It looks like just one more duck punch is needed; just set im.figure = fig after the setting of im.axes. QuadContourSet should really call a.get_axes() and a.get_figure() instead of using the attributes directly; doing so would allow any object that implements the proper interfaces to work, artist or no. > Is this error occurring because there is no bit-mapped representation of > a contour object? It's not really that, it's just that the animation class expects to be given a list of Artists to work with (the original author can correct me if I'm wrong), and that's not what it is being given, because a QuadContourSet is not an Artist. But you can duck punch it until it acts like one :D IMO, there are quite a few things in matplotlib that are a little inconsistent in this way. -- Daniel Hyams dhy...@gmail.com ------------------------------------------------------------------------------ RSA(R) Conference 2012 Save $700 by Nov 18 Register now http://p.sf.net/sfu/rsa-sfdev2dev1 _______________________________________________ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users