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”的主要内容,如果未能解决你的问题,请参考以下文章

如果调用 showGrid,pyqtgraph 会切断刻度标签

PyQtGraph:问题循环通过绘制数据切片

防止创建绘图窗口 - Pyqtgraph plot

PyQtGraph,仅向一个方向滚动图形

如何将鼠标点击信号连接到 pyqtgraph 绘图小部件

如何使用 pyqtgraph 和 QSerialPort 创建实时图?