2013-10-28 10 views
5

Ho un'applicazione che utilizza una tela matplotlib che contiene fondamentalmente un imshow e alcuni oggetti artisti (ad esempio ellissi) sopra di esso. La tela figura è delimitata al seguente sequenza di eventi:Il blpl di Matplotlib non aggiorna la mia tela

  • destro del pulsante di selezione dell'oggetto dell'artista -> cambierà il colore volto degli artisti
  • sinistra-pulsante di rilascio -> si sposterà gli artisti selezionati alla nuova posizione

Per velocizzare il disegno, devo usare il blitting. Quando eseguo le sequenze di eventi, l'ellisse che è stata selezionata per essere spostata viene visualizzata in entrambe le sue vecchie e nuove coordinate nell'area di disegno. Questo problema non si verifica quando sostituisco il macchinario blitting con un canvas.draw().

Avete qualche idea di cosa sto facendo male con il blitting?

Ecco uno snippet veloce e sporco che riproduce il mio problema (ubuntu 12.04, python 2.7, matplotlib 1.1.1rc).

import numpy 
from pylab import figure, show 
from matplotlib.patches import Ellipse 

def on_pick_ellipse(event): 

    if event.mouseevent.button == 3: 
     ellipse = event.artist 
     ellipse.set_facecolor((1,0,0)) 
     subplot.draw_artist(ellipse) 
     fig.canvas.blit(subplot.bbox) 

    return True 

def on_move_ellipse(event): 

    global ellipse 

    if event.button == 3: 
     return 

    if ellipse is not None : 
     fig.canvas.restore_region(background) 
     newCenter = (event.xdata, event.ydata) 
     ellipse.center = newCenter 
     ellipse.set_facecolor((0,0,1)) 
     subplot.draw_artist(ellipse) 
     fig.canvas.blit(subplot.bbox) 
     ellipse = None 
     return True 

ellipse = None 

data = numpy.random.uniform(0,1,(640,256)) 

fig = figure() 
subplot = fig.add_subplot(111,aspect="equal") 
subplot.imshow(data.T) 

background = fig.canvas.copy_from_bbox(subplot.bbox) 

ellipse = Ellipse(xy=(100,100), width=100, height=30, angle=30.0, picker=True) 
ellipse.set_clip_box(subplot.bbox) 
ellipse.set_alpha(0.7) 
ellipse.set_facecolor((0,0,1)) 

subplot.add_artist(ellipse) 

fig.canvas.mpl_connect("pick_event", on_pick_ellipse) 
fig.canvas.mpl_connect("button_release_event", on_move_ellipse) 

show() 

Grazie mille

Eric

risposta

0

La tela deve essere disegnato una volta prima di chiamare fig.canvas.copy_from_bbox.

Quindi con quanto segue il codice sopra funziona correttamente.

fig.canvas.draw() 
background = fig.canvas.copy_from_bbox(subplot.bbox) 
Problemi correlati