Skip to content
Snippets Groups Projects
crosshair.py 2.62 KiB
Newer Older
  • Learn to ignore specific revisions
  • Luke Campagnola's avatar
    Luke Campagnola committed
    """
    Demonstrates some customized mouse interaction by drawing a crosshair that follows 
    the mouse.
    
    
    """
    
    
    Luke Campagnola's avatar
    Luke Campagnola committed
    import initExample ## Add path to library (just for examples; you do not need this)
    import numpy as np
    
    import scipy.ndimage as ndi
    
    Luke Campagnola's avatar
    Luke Campagnola committed
    import pyqtgraph as pg
    from pyqtgraph.Qt import QtGui, QtCore
    from pyqtgraph.Point import Point
    
    
    Luke Campagnola's avatar
    Luke Campagnola committed
    #generate layout
    
    Luke Campagnola's avatar
    Luke Campagnola committed
    app = QtGui.QApplication([])
    win = pg.GraphicsWindow()
    
    Luke Campagnola's avatar
    Luke Campagnola committed
    win.setWindowTitle('pyqtgraph example: crosshair')
    
    Luke Campagnola's avatar
    Luke Campagnola committed
    label = pg.LabelItem(justify='right')
    win.addItem(label)
    p1 = win.addPlot(row=1, col=0)
    p2 = win.addPlot(row=2, col=0)
    
    Luke Campagnola's avatar
    Luke Campagnola committed
    region = pg.LinearRegionItem()
    region.setZValue(10)
    
    Luke Campagnola's avatar
    Luke Campagnola committed
    # Add the LinearRegionItem to the ViewBox, but tell the ViewBox to exclude this 
    # item when doing auto-range calculations.
    p2.addItem(region, ignoreBounds=True)
    
    #pg.dbg()
    p1.setAutoVisible(y=True)
    
    
    
    Luke Campagnola's avatar
    Luke Campagnola committed
    #create numpy arrays
    #make the numbers large to show that the xrange shows data from 10000 to all the way 0
    
    data1 = 10000 + 15000 * ndi.gaussian_filter(np.random.random(size=10000), 10) + 3000 * np.random.random(size=10000)
    data2 = 15000 + 15000 * ndi.gaussian_filter(np.random.random(size=10000), 10) + 3000 * np.random.random(size=10000)
    
    Luke Campagnola's avatar
    Luke Campagnola committed
    
    p1.plot(data1, pen="r")
    p1.plot(data2, pen="g")
    
    Luke Campagnola's avatar
    Luke Campagnola committed
    p2.plot(data1, pen="w")
    
    def update():
    
        region.setZValue(10)
        minX, maxX = region.getRegion()
        p1.setXRange(minX, maxX, padding=0)    
    
    
    Luke Campagnola's avatar
    Luke Campagnola committed
    region.sigRegionChanged.connect(update)
    
    
    def updateRegion(window, viewRange):
        rgn = viewRange[0]
        region.setRegion(rgn)
    
    p1.sigRangeChanged.connect(updateRegion)
    
    
    Luke Campagnola's avatar
    Luke Campagnola committed
    region.setRegion([1000, 2000])
    
    #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)
    
    Luke Campagnola's avatar
    Luke Campagnola committed
    vb = p1.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: red'>y1=%0.1f</span>,   <span style='color: green'>y2=%0.1f</span>" % (mousePoint.x(), data1[index], data2[index]))
            vLine.setPos(mousePoint.x())
            hLine.setPos(mousePoint.y())
    
    Luke Campagnola's avatar
    Luke Campagnola committed
    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_()