5

基本的にimshowとその上にいくつかのアーティストオブジェクト(楕円など)を含むmatplotlibキャンバスを使用するアプリケーションがあります。Figure キャンバスは、次のイベント シーケンスにバインドされています。

  • 右ボタンでアーティスト オブジェクトを選択 --> アーティストの顔の色を変更します
  • 左ボタンを離す --> 選択したアーティストを新しい位置に移動します

描画を高速化するには、ブリッティングを使用する必要があります。イベントのシーケンスを実行すると、移動するために選択された楕円が、キャンバス内の古い座標と新しい座標の両方に表示されます。この問題は、ブリッティング機構を に置き換えた場合には発生しません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()

どうもありがとう

エリック

4

1 に答える 1

0

を呼び出す前に、キャンバスを一度描画する必要がありますfig.canvas.copy_from_bbox

したがって、次のコードを使用すると、上記のコードは正常に機能します。

fig.canvas.draw()
background = fig.canvas.copy_from_bbox(subplot.bbox)
于 2016-12-05T09:05:18.527 に答える