Перемещение точек графика pyqtgraph

Я бы хотел узнать как я могу переместить точки графика?
Я создаю график через pyqtgraph.

У меня в окне получается график вида:

введите сюда описание изображения

Теперь вопрос: как мне сделать так, чтобы при нажатии на фиолетовые точки, у меня тянулся график так, как я захочу?

Т.е., я хочу при нажатии левой кнопкой мыши на точку осуществить перетягивание.

Как это сделать?

Уже и в документации рылся, но так ничего и не нашёл. У меня есть отдельный класс. Я его представлю ниже.

    class Graphic(pyqtgraph.PlotWidget,pyqtgraph.GraphicsScene,pyqtgraph.GraphicsWidget,pyqtgraph.ScatterPlotItem):#,pyqtgraph.QGraphicsItems):
        def __init__(self):
            pyqtgraph.setConfigOption('background', 'w')
            pyqtgraph.setConfigOption('foreground', 'k')
            
            super().__init__()
            #self.enableAutoRange(None,True)
            self.setLabel('left', 'Y')#, units='V')
            self.setLabel('bottom', 'X')#, units='s')
            
            self.setMenuGraph()
            self.setMenuEnabled(False)
            #self.sigPointsClicked.connect(self.gausclicked)
    
            self.setAcceptDrops(True)
    
    
        

Ответы (1 шт):

Автор решения: S. Nick

Ваша задача может выглядеть примерно так:

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

pg.setConfigOptions(antialias=True)

w = pg.GraphicsWindow()
w.setWindowTitle('Draggable')


class Graph(pg.GraphItem):
    def __init__(self):
        self.dragPoint = None
        self.dragOffset = None
        pg.GraphItem.__init__(self)

    def setData(self, **kwds):
        self.data = kwds
        if 'pos' in self.data:
            npts = self.data['pos'].shape[0]
            self.data['adj'] = np.column_stack(
                (np.arange(0, npts-1), np.arange(1, npts))
            )
            self.data['data'] = np.empty(npts, dtype=[('index', int)])
            self.data['data']['index'] = np.arange(npts)
        self.updateGraph()

    def updateGraph(self):
        pg.GraphItem.setData(self, **self.data)

    def mouseDragEvent(self, ev):
        if ev.button() != QtCore.Qt.LeftButton:
            ev.ignore()
            return
        if ev.isStart():
            pos = ev.buttonDownPos()
            pts = self.scatter.pointsAt(pos)
            if len(pts) == 0:
                ev.ignore()
                return
                
            self.dragPoint = pts[0]
            ind = pts[0].data()[0]
            self.dragOffset = self.data['pos'][ind][1] - pos[1]
        elif ev.isFinish():
            self.dragPoint = None
            return
        else:
            if self.dragPoint is None:
                ev.ignore()
                return

        ind = self.dragPoint.data()[0]
        self.data['pos'][ind][1] = ev.pos()[1] + self.dragOffset
        self.data['pos'][ind][0] = ev.pos()[0] + self.dragOffset
        self.updateGraph()
        ev.accept()


g = Graph()
v = w.addPlot()
v.addItem(g)

#                      v <---- попробуйте изменить значение
x = np.linspace(1, 10, 3)

pos = np.column_stack((x, np.sin(x)))
g.setData(pos=pos, size=10, pxMode=True)

if __name__ == '__main__':
    import sys

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

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка