2017-11-22 7 views
0

クリックしたときに散布図の点(SpotItemインスタンス)に関連付けられたユーザデータを取得しようとしています。 documentationに記載されている方法(またはsize()など)はうまく機能しているようですが、data()メソッドを適用すると、NoneTypeオブジェクトが返されます。私は実際にそれが私のユーザーデータを返すと期待していましたが、そうではありません。PyQtGraph SpotItemは、ユーザデータを呼び出すときに 'NoneType'を返します

そこで、関連する元のデータをどのように取り込むことができますか? 私が実際に必要とするのは、x[i]y[i]のセットを元に戻すことができるクリックされたポイントの元の入力リストのインデックスiのようなものです。ここで

は私のサンプルコードです:

import pyqtgraph as pg 

#some dummy data 
x=[0,1,2,3,4,5,3.5,3.4] 
y=[5,4,3,2,1,0,3.4,3.5] 

win=pg.GraphicsWindow() 
p1=win.addPlot(row=1, col=1) 
my_data=pg.ScatterPlotItem(x,y,symbol='o',size=30) 

p1.addItem(my_data) 

def clicked(items,points): 
    print("point data: ",points[0].data()) 


my_data.sigClicked.connect(clicked) 

私は(スパイダー3.1.4と)のPython 3.6を使用しています、Qtの5.6とPyQtは5

答えて

0

sigClickedは私たちにされている項目(ScatterPlotItem)を得ました押された点(SpotItem)、秒を使って位置を与える要素Point()を得ることができます。これは、座標を返すメソッドx() y y()を持っています。アイテムからは、最初に入れたxとyをそれぞれdata['x']data['y']にしてから、ポイントを押してすべてのポイントを得て、使用するインデックスを見つけてnp.argwhere()とし、値をnp.intersect1d()、最後に、繰り返しポイントをsetで削除します。

import numpy as np 
from pyqtgraph.Qt import QtGui, QtCore 
import pyqtgraph as pg 


app = QtGui.QApplication([]) 

x=[0,1,2,3,4,5,3.5,3.4, 3.4] 
y=[5,4,3,2,1,0,3.4,3.5, 3.5] 

win=pg.GraphicsWindow() 
p1=win.addPlot(row=1, col=1) 

my_data=pg.ScatterPlotItem(x,y,symbol='o',size=30) 

p1.addItem(my_data) 

def clicked(item, points): 
    indexes = [] 
    for p in points: 
     p = p.pos() 
     x, y = p.x(), p.y() 
     lx = np.argwhere(item.data['x'] == x) 
     ly = np.argwhere(item.data['y'] == y) 
     i = np.intersect1d(lx, ly).tolist() 
     indexes += i 
    indexes = list(set(indexes)) 
    print(indexes) 

my_data.sigClicked.connect(clicked) 

if __name__ == '__main__': 
    import sys 
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): 
     QtGui.QApplication.instance().exec_() 
+0

これはまさに私が探していたものです。したがって、 'data'メソッドは、' SpotItem'ではなく、 'ScatterPlotItem'に適用される必要があります。次に、関連するユーザーデータを返します。ありがとう! – Lobo

関連する問題