Hi,

I've been debugging this for hours now and could really use the help
of someone smarter than me. In working on blitting with animations,
I've run into a problem when trying to use blitting + multiple
subplots + lines with markers. It's an esoteric combination to be
sure, but I have a script (attached) that demonstrates my problem.  As
far as I can tell, the addition of a marker to a line object causes to
canvas.restore_region() to no longer function (I've paused the
animation, after a blit to flush the draw, after every stage). The
data in the region saved from copy_from_bbox is fine, but calling
restore_region() with it has no effect.  Removing marker from the line
specification causes the problem to disappear.  The net effect of the
problem is that the other subplot (than the one with the marker) does
not have the previous draw cleared, resulting in a smearing effect.

Anybody have a clue?

Ryan

-- 
Ryan May
Graduate Research Assistant
School of Meteorology
University of Oklahoma
#!/usr/bin/env python
# Reveals a bug in blitting with multiple subplots caused by the use of
# markers
import time

import gtk, gobject

import matplotlib
matplotlib.use('GTKAgg')

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(121)
ax2 = fig.add_subplot(122)
canvas = fig.canvas

fig.subplots_adjust(left=0.3, bottom=0.3) # check for flipy bugs
ax.grid() # to ensure proper background restore
ax2.grid()

# create the initial line
x = np.arange(0,2*np.pi,0.01)
line, = ax.plot(x, np.sin(x), animated=True, lw=2, marker='o')
line2, = ax2.plot(x, np.cos(x), 'k', animated=True, lw=2)

canvas.draw()

def update_line(*args):
    if update_line.background is None:
        update_line.background = canvas.copy_from_bbox(ax.bbox)
        update_line.background2 = canvas.copy_from_bbox(ax2.bbox)

    canvas.restore_region(update_line.background)
    line.set_ydata(np.sin(x+update_line.cnt/10.0))
    ax.draw_artist(line)
    canvas.blit(ax.bbox)

    canvas.restore_region(update_line.background2)
    line2.set_ydata(np.sin(x+update_line.cnt/10.0))
    ax2.draw_artist(line2)
    canvas.blit(ax2.bbox)

    if update_line.cnt==1000:
        gtk.main_quit()
        raise SystemExit

    update_line.cnt += 1
    return True

update_line.cnt = 0
update_line.background = None

def start_anim(event):
    gobject.timeout_add(100, update_line)
    canvas.mpl_disconnect(start_anim.cid)

start_anim.cid = canvas.mpl_connect('draw_event', start_anim)

plt.show()
------------------------------------------------------------------------------
This SF.net email is sponsored by Sprint
What will you do first with EVO, the first 4G phone?
Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first
_______________________________________________
Matplotlib-devel mailing list
Matplotlib-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-devel

Reply via email to