2013-10-28 5 views
5

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() 

どうもありがとう

エリック

答えて

0

キャンバスはfig.canvas.copy_from_bboxを呼び出す前に、一度描かれていなければ。

したがって、上記のコードは正常に動作します。

fig.canvas.draw() 
background = fig.canvas.copy_from_bbox(subplot.bbox) 
関連する問題