2016-07-05 14 views
2

matplotlib LassoSelectorを使用して散布図からいくつかの点を選択し、選択した点のみの別の図を生成しようとしています。 2番目のプロットで別のmatplotlibウィジェットを使用しようとすると、動作しませんが、エラーや警告メッセージは表示されません。以下は、LassoSelectorとSpanSelectorを使用した最小限の例です。他のmatplotlibウィジェットで作成されたプロットにMatplotlibウィジェットを使用

他のウィジェットも試しました。ボタン・ウィジェットはボタンを表示しますが、ボタン・プレスのアクションは実行されません。

import numpy as np 
from matplotlib.pyplot import * 
from matplotlib.widgets import SpanSelector, LassoSelector 
from matplotlib.path import Path 

def onselect(verts): 
    global xys,data 

    #get indexes of selected points 
    path = Path(verts) 
    xysn = xys.get_offsets() 
    ind = np.nonzero([path.contains_point(xy) for xy in xysn])[0] 

    #plot the second figure 
    fig=figure(2) 
    ax=fig.add_subplot(111) 
    ax.hist(data[:,0][ind],10) 

    #this should be executed when SpanSelector is used 
    def action(min,max): 
     print min,max 

    #try to do SpanSelector (this fails) 
    span=SpanSelector(ax,action,'horizontal') 

    show() 

#initialize a figure 
fig=figure(1) 
ax=fig.add_subplot(111) 

#create data 
data=np.array([[1,6], [4,8],[0,4],[4,2],[9,6],[10,8],[2,2],[5,5],[0,4],[4,5]]) 

#plot data 
xys=ax.scatter(data[:,0],data[:,1]) 

#select point by drawing a path around them 
lasso = LassoSelector(ax, onselect=onselect) 

show() 

答えて

0

matplotlibウィジェットはイベント駆動型なので、ユーザーの入力を待ちます。コードの問題は、新しいイベントハンドラSpanSelectorを使用して新しいFigureを作成しようとしていることです。私ので、新しいイベント、LassoSelectorが登録され、ユーザ入力されていない

QCoreApplication::exec: The event loop is already running 

、あなたが以前のものの結果として、新しいイベントを追加し、SpanSelectorでコメントアウトことができれば、私は次のエラーを取得するかわからないことではありませんピックアップ(そして新しいフィギュアは表示されません)。すべての図を作成し、可能なすべてのイベントをコードの先頭に登録する方がよいでしょう。以下は、

import numpy as np 
from matplotlib.pyplot import * 
from matplotlib.widgets import SpanSelector, LassoSelector 
from matplotlib.path import Path 

#this should be executed when LassoSelector is used 
def onselect(verts): 
    global xys,data 

    #get indexes of selected points 
    path = Path(verts) 
    xysn = xys.get_offsets() 
    ind = np.nonzero([path.contains_point(xy) for xy in xysn])[0] 

    #Clear and update bar chart 
    h, b = np.histogram(data[:,0][ind],10) 
    for rect, bars in zip(rects, h): 
     rect.set_height(bars) 
    ax2.bar(mb, h, align='center') 
    draw() 

#this should be executed when SpanSelector is used 
def action(min,max): 
    print min,max 

#initialize figures 
fig1=figure(1) 
ax1=fig1.add_subplot(111) 

fig2=figure(2) 
ax2=fig2.add_subplot(111) 

#create data 
data=np.array([[1,6],[4,8],[0,4],[4,2],[9,6],[10,8],[2,2],[5,5],[0,4],[4,5]]) 

#plot data 
xys=ax1.scatter(data[:,0],data[:,1]) 

#Plot initial histogram of all data 
h, b = np.histogram(data[:,0],10) 
mb = [0.5*(b[i]+b[i+1]) for i in range(b.shape[0]-1)] 
rects = ax2.bar(mb, h, align='center') 

#Register lasso selector 
lasso = LassoSelector(ax1, onselect=onselect) 

#Register SpanSelector 
span=SpanSelector(ax2,action,'horizontal') 

show() 

注意、棒グラフを更新するために、それは少しのプロットよりもトリッキーなので、私はこの答えはいくつかの理由について、ここでDynamically updating a bar plot in matplotlib

使用ですが、あなたが何をしたいのかに近づくべきですヒストグラム図2は、クリックすると更新されます。私はこのために2軸の単一図形を使用することを検討します。これは作業が簡単な場合があります。

fig, ax = subplots(2,1) 
ax1 = ax[0]; ax2 = ax[1] 
関連する問題