PyQtGraph SpotItem 在调用用户数据时返回“NoneType”
Posted
技术标签:
【中文标题】PyQtGraph SpotItem 在调用用户数据时返回“NoneType”【英文标题】:PyQtGraph SpotItem returns 'NoneType' when calling user data 【发布时间】:2018-05-06 05:30:52 【问题描述】:单击时,我试图在散点图中获取一个点(这是一个SpotItem
实例)的相关用户数据。虽然documentation 中列出的方法(如pos()
或size()
)似乎工作正常,但当我应用data()
方法时收到NoneType
对象。我实际上希望它返回我的用户数据,但它没有。
那么,我如何检索我输入的相关原始数据?
我真正需要的是一个类似于点击点的原始输入列表的索引i
,它可以让我追踪相应的x[i]
y[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)
我正在使用 Python 3.6(带有 Spyder 3.1.4)、Qt 5.6 和 PyQt 5
【问题讨论】:
【参考方案1】:sigClicked
给了我们被按下的项目 (ScatterPlotItem
) 和被按下的点 (SpotItem
),我们可以在几秒钟内获得元素 Point()
,它给了我们位置,这具有返回坐标的方法x()
y y()
。从 item 我们可以得到你最初通过data['x']
和data['y']
分别放置的所有x和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_()
【讨论】:
是的,这正是我想要的。所以data
方法需要应用于ScatterPlotItem
而不是SpotItem
,然后它会返回相关的用户数据。谢谢!以上是关于PyQtGraph SpotItem 在调用用户数据时返回“NoneType”的主要内容,如果未能解决你的问题,请参考以下文章