cross hair on plot embeded via the designer-qt5.

187 views
Skip to first unread message

Trifon Trifonov

unread,
May 9, 2019, 5:35:50 AM5/9/19
to pyqtgraph

I am trying to make a cross hair on my pyqtgraph interactive plots, which are embedded in a PyQt5 GUI thanks to the designer-qt5. I found a working code in the pyqtgraph "examples". A simplified WORKING example is posted below. Now I want the same, but the problem seems to be that I promoted a QGraphicsView() to a pg.PlotWidget in the designer, instead of pg.GraphicsWindow()? The Code does not work for me because my p1 is "pyqtgraph.widgets.PlotWidget.PlotWidget object" while in the example p1 is
"pyqtgraph.graphicsItems.PlotItem.PlotItem.PlotItem object".


So what should I do to make this example work for me?



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

pg.setConfigOption('background', '#ffffff')
pg.setConfigOption('foreground', 'k')
pg.setConfigOptions(antialias=True)  

app = QtGui.QApplication([])
win = pg.GraphicsWindow()
win.setWindowTitle('pyqtgraph example: crosshair')
label = pg.LabelItem(justify='right')
win.addItem(label)
p1 = win.addPlot(row=1, col=0)       

p1.setAutoVisible(y=True)

#create numpy arrays
#make the numbers large to show that the xrange shows data from 10000 to all the way 0
data1 = 10000 + 15000 * pg.gaussianFilter(np.random.random(size=10000), 10) + 3000 * np.random.random(size=10000)

p1.plot(data1, pen="r")

#cross hair
vLine = pg.InfiniteLine(angle=90, movable=False)
hLine = pg.InfiniteLine(angle=0, movable=False)
p1.addItem(vLine, ignoreBounds=True)
p1.addItem(hLine, ignoreBounds=True)

vb = p1.vb 

print(p1)
print(vb)

def mouseMoved(evt):
    pos = evt[0]  ## using signal proxy turns original arguments into a tuple
    if p1.sceneBoundingRect().contains(pos):
        mousePoint = vb.mapSceneToView(pos)
        index = int(mousePoint.x())
        if index > 0 and index < len(data1):
            label.setText("<span style='font-size: 12pt'>x=%0.1f,   <span style='color: green'>y2=%0.1f</span>" % (mousePoint.x(), data1[index]))
        vLine.setPos(mousePoint.x())
        hLine.setPos(mousePoint.y())

proxy = pg.SignalProxy(p1.scene().sigMouseMoved, rateLimit=60, slot=mouseMoved)
#p1.scene().sigMouseMoved.connect(mouseMoved)

## Start Qt event loop unless running in interactive mode or using pyside.
if __name__ == '__main__':
    import sys
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()

Jona Joachim

unread,
May 9, 2019, 7:20:27 AM5/9/19
to pyqtgraph
Hi Trifon,
you can get the PlotItem using the getPlotItem() method of your PlotWidget.

p1 = graphicsView.getPlotItem()


Kind regards,
Jona Joachim
Message has been deleted
Message has been deleted
Message has been deleted
Message has been deleted
Message has been deleted

Trifon Trifonov

unread,
May 9, 2019, 9:01:03 AM5/9/19
to pyqtgraph
Hi Jona,

Thanks for the swift reply!

I am aware that you can get the PlotItem() from the PlotWidget object. I am not sure if this is useful, but
below I shared my actual code.Shortly, I tried:


p1vb
= p1.getPlotItem()

vb
= p1vb.vb #(to get the ViewBox, later needed in mousePoint = vb.mapSceneToView(pos))




but still I cant get the needed effect on my plot.

    def update_RV_plots(self):
       
global fit, p1,p2
 
        p1
.plot(clear=True,)
        p2
.plot(clear=True,)
 
   
       
self.check_RV_symbol_sizes()
 
       
if len(fit.filelist.idset)==0:
           
return

       
if self.jitter_to_plots.isChecked():
            error_list
= self.add_jitter(fit.fit_results.rv_model.rv_err, fit.filelist.idset)
       
else:
            error_list
= fit.fit_results.rv_model.rv_err
 
        p1
.addLine(x=None, y=0,   pen=pg.mkPen('#ff9933', width=0.8))
       
#p1.addLine(x=None,
 y
=fap, pen=pg.mkPen('k', width=0.8, style=QtCore.Qt.DotLine)) for
ii
,fap in enumerate(np.array([0]) ) ]            
 
 
       
if fit.doGP == True:
            y_model
= fit.fit_results.model + fit.gp_model_curve[0]
            y_model_o_c
= fit.gp_model_curve[0]
       
else:
            y_model
= fit.fit_results.model
            y_model_o_c
= np.zeros(len(y_model))

        p1
.plot(fit.fit_results.model_jd,y_model,
        pen
={'color': 0.5, 'width': 1.1},enableAutoRange=True, #symbolPen={'color': 0.5, 'width': 0.1}, symbolSize=1,symbol='o',
        viewRect
=True, labels =  {'left':'RV', 'bottom':'JD'})
       
       
if  fit.doGP == True:
            pfill
= pg.FillBetweenItem(p1.plot(fit.fit_results.model_jd, fit.fit_results.model + fit.gp_model_curve[0]+fit.gp_model_curve[2]),
            p1
.plot(fit.fit_results.model_jd, fit.fit_results.model + fit.gp_model_curve[0]-fit.gp_model_curve[2]),
                                       brush
= pg.mkColor(244,140,66,128))
            p1
.addItem(pfill)  
           
           
       
for i in range(max(fit.filelist.idset)+1):
            p1
.plot(fit.fit_results.rv_model.jd[fit.filelist.idset==i],fit.fit_results.rv_model.rvs[fit.filelist.idset==i],
            pen
=None, #{'color': colors[i], 'width': 1.1},
            symbol
=fit.pyqt_symbols_rvs[i],
            symbolPen
={'color': fit.colors[i], 'width': 1.1},
            symbolSize
=fit.pyqt_symbols_size_rvs[i],enableAutoRange=True,viewRect=True,
            symbolBrush
=fit.colors[i]
           
)        
            err1
= pg.ErrorBarItem(x=fit.fit_results.rv_model.jd[fit.filelist.idset==i],
                                   y
=fit.fit_results.rv_model.rvs[fit.filelist.idset==i],symbol='o',
           
#height=error_list[fit.filelist.idset==i],
            top
=error_list[fit.filelist.idset==i],
            bottom
=error_list[fit.filelist.idset==i],          
            beam
=0.0, pen=fit.colors[i])  
           
            p1
.addItem(err1)  
           
       
################### TEST cross hair ############    
       
# p1.setAutoVisible(y=True)

        cross
= True
       
if cross ==True:

           
#cross hair
            vLine
= pg.InfiniteLine(angle=90, movable=False)
            hLine
= pg.InfiniteLine(angle=0, movable=False)
            p1
.addItem(vLine, ignoreBounds=True)
            p1
.addItem(hLine, ignoreBounds=True)

           
            p1vb
= p1.getPlotItem()
            vb
= p1vb.vb
           
# print(vb)


            label
= pg.LabelItem(justify='right')

            p1
.addItem(label)
            data1
= fit.fit_results.rv_model.rvs

           
def mouseMoved(evt)

                pos
= evt[0]  ## using signal proxy turns original arguments into a tuple

               
print(pos)

               
if p1.sceneBoundingRect().contains(pos):
                    mousePoint
= vb.mapSceneToView(pos)
                    index
= int(mousePoint.x())
                   
if index > 0 and index < len(data1):

                        label
.setText("%0.1f, %0.1f/" % (mousePoint.x(), data1[index]))

                    vLine
.setPos(mousePoint.x())
                    hLine
.setPos(mousePoint.y())

            proxy
= pg.SignalProxy(p1.scene().sigMouseMoved, rateLimit=60, slot=mouseMoved)
   
   
       
################### TEST cross hair ############
Message has been deleted

Trifon Trifonov

unread,
May 9, 2019, 4:51:30 PM5/9/19
to pyqtgraph
I am very sorry for the noise!!! I fix it myself!

The important part was:

plot_wg.proxy = proxy

Very simple...


Below is the function, which should work for any PlotWidget:



 def cross_hair(self, plot_wg, log=False ):

 

 
global fit

 
################### TETS cross hair ############3


 

 vLine
= pg.InfiniteLine(angle=90, movable=False)#, pos=0)

 hLine
= pg.InfiniteLine(angle=0, movable=False)#, pos=2450000)

 plot_wg
.addItem(vLine, ignoreBounds=True)

 plot_wg
.addItem(hLine, ignoreBounds=True)

 

 

 vb
= plot_wg.getViewBox()

 


 

 label
= pg.TextItem()

 plot_wg
.addItem(label)

 

 
def mouseMoved(evt):

 pos
= evt[0] ## using signal proxy turns original arguments into a tuple

 
if plot_wg.sceneBoundingRect().contains(pos):

 

 mousePoint
= vb.mapSceneToView(pos)


 
if log == True:

 label
.setText("x=%0.3f, y1=%0.3f"%(10**mousePoint.x(), mousePoint.y()))

 
else:

 label
.setText("x=%0.3f, y1=%0.3f"%(mousePoint.x(), mousePoint.y()))

 

 vLine
.setPos(mousePoint.x())

 hLine
.setPos(mousePoint.y())

 
#print(mousePoint.x(),mousePoint.y())


 

 plot_wg
.getViewBox().setAutoVisible(y=True)


 

 proxy
= pg.SignalProxy(plot_wg.scene().sigMouseMoved, rateLimit=60, slot=mouseMoved)

 plot_wg
.proxy = proxy

 
################### TETS cross hair ############3


Reply all
Reply to author
Forward
0 new messages