2013-10-28 12 views
5

Ich habe eine Anwendung, die eine Matplotlib-Leinwand verwendet, die im Grunde eine IMshow und einige Künstlerobjekte (z. B. Ellipsen) darüber enthält. Die Figur Leinwand wird auf die folgende Ereignissequenz begrenzt:Matplotlib Blitting aktualisiert meine Leinwand nicht

  • der rechten Taste, um den Künstler Objekt auswählen -> die Gesichtsfarbe der Künstler
  • links Knopfauslösung ändern -> werden die ausgewählten Künstler bewegen an die neue Position

Um die Zeichnung zu beschleunigen, muss ich Blitting verwenden. Wenn ich die Ereignisfolgen ausführe, wird die Ellipse, die zum Verschieben ausgewählt wurde, sowohl in der alten als auch in der neuen Koordinate in der Zeichenfläche angezeigt. Dieses Problem tritt nicht auf, wenn ich die Blitting-Maschinerie durch eine canvas.draw() ersetze.

Würdest du eine Vorstellung davon haben, was ich mit dem Blitting falsch mache?

Hier ist ein schnelles und schmutziges Snippet, das mein Problem reproduziert (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() 

Vielen Dank

Eric

Antwort

0

Die Leinwand einmal gezogen werden muss, bevor fig.canvas.copy_from_bbox aufrufen.

Also mit dem folgenden funktioniert der obige Code gut.

fig.canvas.draw() 
background = fig.canvas.copy_from_bbox(subplot.bbox) 
Verwandte Themen