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