2017-07-14 11 views
1

私はPythonでmatplotlibを使って画像のスタックの領域の平均をプロットするための小さなツールを作ろうとしていました。私は放すと、プロットが自動的に更新されません) 1:matplotlibで対話的に画像の平均をプロットする

fig, (ax1,ax2) = plt.subplots(2) 
ax1.imshow(im[:100].mean(axis=0)) 
line, =ax2.plot(im.mean(axis=1).mean(axis=1)) 

def line_select_callback(eclick, erelease): 
    global x1, y1 , x2, y2 
    'eclick and erelease are the press and release events' 
    x1, y1 = eclick.xdata, eclick.ydata 
    x2, y2 = erelease.xdata, erelease.ydata 
    print("(%3.2f, %3.2f) --> (%3.2f, %3.2f)" % (x1, y1, x2, y2)) 
    print(" The button you used were: %s %s" % (eclick.button, erelease.button)) 
    verts=np.array([x1, y1, x2, y2],np.uint16) 
    prof=im[:,verts[1]:verts[3],verts[0]:verts[2]].mean(axis=1).mean(axis=1) 
    ax2.plot(prof) 
    ax2.draw() 


def toggle_selector(event): 
    global returned 
    print(' Key pressed.') 
    if event.key in ['Q', 'q'] and toggle_selector.RS.active: 
     print(' RectangleSelector deactivated.') 
     toggle_selector.RS.set_active(False) 
    if event.key in ['A', 'a'] and not toggle_selector.RS.active: 
     print(' RectangleSelector activated.') 
     toggle_selector.RS.set_active(True) 
    if event.key in ['Y', 'y'] and not toggle_selector.RS.active: 
     returned=True 

plt.connect('key_press_event', toggle_selector) 

toggle_selector.RS = RectangleSelector(ax1, line_select_callback, 
              drawtype='box', useblit=True, 
              button=[1, 3], # don't use middle button 
              minspanx=5, minspany=5, 
              spancoords='pixels', 
              interactive=True) 
fig.show() 

私はこれで2つの問題を持っている:私はここにコードがあるPersistent rectangle selector

に使用したのと同様の長方形セレクタウィジェットを、使用しています私のマウスドラッグ 2)左マウスボタンを離しても矩形選択ツールが私のマウスにくっつくようです。

答えて

0

これはどの環境で動作するはずです。したがって、これをスクリプトとして実行していると仮定すると、数字はplt.show()と表示され、更新はfig.canvas.draw_idle()と表示されます。

import matplotlib.pyplot as plt 
from matplotlib.widgets import RectangleSelector 
import numpy as np 

im = np.random.rand(100,100) 
fig, (ax1,ax2) = plt.subplots(2, gridspec_kw=dict(height_ratios=[5,1])) 
ax1.imshow(im, cmap="summer") 
line, =ax2.plot(im.mean(axis=1)) 

def line_select_callback(eclick, erelease): 
    global x1, y1 , x2, y2 
    'eclick and erelease are the press and release events' 
    x1, y1 = eclick.xdata, eclick.ydata 
    x2, y2 = erelease.xdata, erelease.ydata 
    print("(%3.2f, %3.2f) --> (%3.2f, %3.2f)" % (x1, y1, x2, y2)) 
    print(" The button you used were: %s %s" % (eclick.button, erelease.button)) 
    verts=np.array([x1, y1, x2, y2],np.uint16) 
    prof=im[verts[1]:verts[3],verts[0]:verts[2]].mean(axis=1) 
    line.set_data(np.arange(int(min(y1,y2)), int(max(y1,y2))), prof) 
    fig.canvas.draw_idle() 


def toggle_selector(event): 
    global returned 
    print(' Key pressed.') 
    if event.key in ['Q', 'q'] and toggle_selector.RS.active: 
     print(' RectangleSelector deactivated.') 
     toggle_selector.RS.set_active(False) 
    if event.key in ['A', 'a'] and not toggle_selector.RS.active: 
     print(' RectangleSelector activated.') 
     toggle_selector.RS.set_active(True) 
    if event.key in ['Y', 'y'] and not toggle_selector.RS.active: 
     returned=True 

plt.connect('key_press_event', toggle_selector) 

toggle_selector.RS = RectangleSelector(ax1, line_select_callback, 
              drawtype='box', useblit=True, 
              button=[1, 3], # don't use middle button 
              minspanx=5, minspany=5, 
              spancoords='pixels', 
              interactive=True) 
plt.show() 
関連する問題