2013-10-28 11 views
5

Tôi có một ứng dụng sử dụng canvas matplotlib chứa các đối tượng imshow và một số nghệ sĩ cơ bản (ví dụ: hình elip) ở trên cùng. Con số vải giáp với chuỗi sự kiện sau đây:Làm mờ Matplotlib không cập nhật canvas của tôi

  • phải nút chọn đối tượng nghệ sĩ -> sẽ thay đổi màu sắc khuôn mặt của các nghệ sĩ
  • trái nút phát hành -> sẽ di chuyển các nghệ sĩ được lựa chọn đến vị trí mới

Để tăng tốc bản vẽ, tôi phải sử dụng tính năng nhòe. Khi tôi chạy chuỗi các sự kiện, hình elip đã được chọn để di chuyển được hiển thị ở cả tọa độ cũ và mới của nó trong canvas. Vấn đề này không xảy ra khi tôi thay thế thiết bị phun bằng canvas.draw().

Bạn có bất kỳ ý tưởng nào về những gì tôi đang làm sai với việc không?

Đây là đoạn trích nhanh và dơ bẩn tái tạo sự cố của tôi (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() 

Thanks a lot

Eric

Trả lời

0

Các vải phải được rút ra một lần trước khi gọi fig.canvas.copy_from_bbox.

Vì vậy, với mã sau đây hoạt động tốt.

fig.canvas.draw() 
background = fig.canvas.copy_from_bbox(subplot.bbox) 
Các vấn đề liên quan