matplotlibキャンバスを使用するアプリケーションがあります。このアプリケーションには、基本的にimshowオブジェクトとその上にいくつかのアーティストオブジェクト(楕円など)が含まれています。フィギュアのキャンバスには、以下のイベントシーケンスに囲まれて:Matplotlib blittingでキャンバスが更新されない
- 右ボタンアーティストのオブジェクトを選ぶ - >アーティスト
- 左ボタンリリースの顔の色を変更します - >選択したアーティストを移動します新しい位置へ
高速化するために、私はblittingを使用しなければなりません。イベントのシーケンスを実行すると、移動するように選択された楕円がキャンバスの古い座標と新しい座標の両方に表示されます。この問題は、blitting機械をcanvas.draw()
に置き換えると発生しません。
私がブリッティングに間違っていることを知っていますか?
私の問題(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()
どうもありがとう
エリック