Метки ToolTip на графике pyqtgraph
Ребят всем привет! Вообщем. У меня есть график, как этот.
import numpy as np
import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui
pg.setConfigOptions(antialias=True)
w = pg.PlotWidget()
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()
print(ev.pos(),self.dragPoint.data()[0])
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_()
Пользователь S.Nick, очень помог. Теперь я хочу создать метки на нём. Я создал подписи точек. При помощи:
for i,j,k in zip(*self.table.UNIQUIE_X):
k[str(list(k.keys())[0])].setPos(i, j)
k[str(list(k.keys())[0])].setToolTip('x='+str(i)+','+'y='+str(j))
self.view.addItem(k[str(list(k.keys())[0])])
И этот код отлично работает! Я заметил, что класс поддерживает свойство setToolTip (добавление метки). В коде, в цикле for я задаю просто подписи. И ставлю метки на них (всплывающие подсказки).
Но! Когда я навожу курсор мыши на точку, то метка убирается.
Как быть? Мне нужны метки не на подписях, а при наведении на точку! Скрин прикрепляю что есть на данный момент.
Итак внесу правки. Я разобрался более-менее в чём проблема. В данной реализации там указывается symbol. Но как я могу применить и изменить его на ScatterPlotItem? Т.е. мне в структуре нужно указать точки, только не как symbol, а как ScatterPlotItem.
Как это выполнить?
Ответы (1 шт):
Как вариант, попробуйте.
import sys
import numpy as np
import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui
app = pg.mkQApp()
pg.setConfigOptions(antialias=True)
class Graph(pg.GraphItem):
def __init__(self, pw):
self.pw = pw
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()
print(ev.pos(), self.dragPoint.data()[0])
ev.accept()
# !!!
def hoverEvent(self, ev):
try:
items = self.pw.scene().items(ev.scenePos())
except AttributeError as e:
return
for item in items:
if isinstance(item, pg.GraphItem):
if item.scatter.pointsAt(ev.pos()):
pw.setToolTip(f'<b>x={ev.pos().x():.1f}, y={ev.pos().y():.1f}</b>')
else:
pw.setToolTip('')
pw = pg.PlotWidget(title="PlotItem")
g = Graph(pw) # +++ pw
pw.addItem(g)
pw.showGrid(x=True, y=True)
pw.show()
# v <---- попробуйте изменить значение
x = np.linspace(1, 10, 5)
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_()

