From: Benjamin R. <ben...@ou...> - 2011-11-02 05:58:49
|
On Wednesday, November 2, 2011, John Jameson <jw...@gm...> wrote: > Hi, > I am trying to do an animation in two axes (subplots) and I can get it to work so-so if I do it the "wrong way" but when I do it the "right way" I don't see anything in my second subplot. > The first subplot (ax1) shows a bunch of moving line segments ("sticks") and the second one (ax2) shows a low resolution (pixellated) view of the first subplot. The latter (ax2) uses imshow() but when I update it through setarray() and blit it onto the canvas it doesn't show up (although the sticks in the ax1 show up fine). However, if I insert the line canvas.draw() after the ax2 blit it works but it makes the ax1 animation very jittery. > Can someone tell me the correct way to do this? I'm still a tenderfoot in Matplotlib ;-( > thanks! > John > > > > > > > class Sticks_animator(): > > x_offset = 0.0 > > def __init__(self, n_sticks_tot, n_pixels_horizontal=0, > > n_pixels_vertical=0 ): > > . > . > . > . > . > > def reset(self): > > self.background1 = None > > self.background2 = None > > self.start = 1 > > def draw_sticks(self): > > if self.start: > > self.poly = [] > > for i in range( self.n_sticks_tot): > > x_stick = array([ [self.x1[i], self.y1[i]], > > [self.x2[i], self.y2[i]] ] ) > > > > self.poly.append( Polygon( x_stick, animated=True, > > lw=2, fill=False) ) > > self.ax1.add_patch(self.poly[i]) > > self.ax1.draw_artist(self.poly[i]) > > > > else: > > for i in range( self.n_sticks_tot): > > x_stick = array([ [self.x1[i], self.y1[i]], > > [self.x2[i], self.y2[i]] ] ) > > self.poly[i].set_xy(x_stick) > > self.ax1.draw_artist(self.poly[i]) > > def draw_retina(self): > > if self.start: > > self.img = self.ax2.imshow(self.inten, interpolation='nearest') > > else: > > self.img.set_array(self.inten) > > > > def step_it(self): > > self.inten, self.n_sticks_tot, self.x1, self.y1, \ > > self.x2, self.y2, done = self.stks.Step_it() > > > # self.stks.Step_it() is finds all the stick coordinates > > # and inten is a NXN array of a pixellated (low res) view > > # of all the sticks > > > > if self.background1 is None: > > self.background1 = self.canvas.copy_from_bbox(self.ax1.bbox) > > self.canvas.restore_region(self.background1) > > self.draw_sticks() > > self.canvas.blit(self.ax1.bbox) > > if self.add_retina_view: > > self.draw_retina() > > self.canvas.blit(self.ax2.bbox) > > # self.canvas.draw() IF I UNCOMMENT THIS IT "WORKS" > > self.start = 0 > > > > if done: > > gtk.main_quit() > > raise SystemExit > > return True > > def mainer( self, stks ): > > self.stks = stks > > if isinteractive(): > > ioff() > > def start_anim(event): > > gobject.idle_add( self.step_it ) > > self.canvas.mpl_disconnect(start_anim.cid) > > > > start_anim.cid = self.canvas.mpl_connect('draw_event', start_anim) > > plt.show() > Which version of mpl are you using? v1.1.0 comes with an animation module to handle most of this for you. Check out the animation examples on the website. Note, very often, when blitting, the issue can be that the individual artists were not sett as animated. Note that (counter-intuitively) the new animation module does not fully work if animate=True, so I'd using animate.py, don't set animate=True. Hopefully, that wasn't too confusing... Ben Root |