2017-06-15 4 views
0

Ich möchte die X-Achse von mehreren pyqtgraph Plots synchronisieren. Wenn der Benutzer die X-Achse mit Mausinteraktionen neu skaliert (z. B. Scroll-Rad, während sich die Maus auf der x-Achse befindet), möchte ich allen anderen Plots dieselben Änderungen zuweisen. Also, wie mache ich das?pyqtgraph: Synchronisieren der Skalierung von Achsen in verschiedenen Plots

Ich habe einen minimierten Code von einem grundlegenden Beispiel unten abgeleitet.

Muss ich die viewRangeChanged() Funktionen von w1 und w2 überschreiben?

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

from pyqtgraph.dockarea import * 


win = QtGui.QMainWindow() 
area = DockArea() 
win.setCentralWidget(area) 
win.resize(1000,500) 
win.setWindowTitle('pyqtgraph example: dockarea') 


d1 = Dock("Dock1") 
d2 = Dock("Dock2") 
area.addDock(d1, 'bottom') 
area.addDock(d2, 'bottom', d1) 

w1 = pg.PlotWidget(title="Dock 1 plot") 
w1.plot(np.random.normal(size=100)) 
d1.addWidget(w1) 

w2 = pg.PlotWidget(title="Dock 2 plot") 
w2.plot(np.random.normal(size=100)) 
d2.addWidget(w2) 

win.show() 

## 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_() 

Diese Frage hat eine here mit einer anderen Antwort auf diese Frage oben folgen.

Antwort

2

Wir müssen das sigRangeChanged-Signal verwenden und verbinden es mit einem Steckplatz, das Problem ist, dass die Änderung des Bereichs ein anderes Element würde das Signal sigRangeChanged generieren und so weiter eine Endlosschleife generieren, müssen Sie diese Signale trennen bevor Sie die Änderungen vornehmen und sie wieder mit dem Finale verbinden.

w1.sigRangeChanged.connect(onSigRangeChanged) 
w2.sigRangeChanged.connect(onSigRangeChanged) 

def onSigRangeChanged(r): 
    w1.sigRangeChanged.disconnect(onSigRangeChanged) 
    w2.sigRangeChanged.disconnect(onSigRangeChanged) 
    if w1 == r: 
     w2.setRange(xRange=r.getAxis('bottom').range) 
    elif w2 == r: 
     w1.setRange(xRange=r.getAxis('bottom').range) 

    w1.sigRangeChanged.connect(onSigRangeChanged) 
    w2.sigRangeChanged.connect(onSigRangeChanged) 

Beispiel:

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


def onSigRangeChanged(r): 
    w1.sigRangeChanged.disconnect(onSigRangeChanged) 
    w2.sigRangeChanged.disconnect(onSigRangeChanged) 
    if w1==r: 
     w2.setRange(xRange=r.getAxis('bottom').range) 
    elif w2 == r: 
     w1.setRange(xRange=r.getAxis('bottom').range) 

    w1.sigRangeChanged.connect(onSigRangeChanged) 
    w2.sigRangeChanged.connect(onSigRangeChanged) 

app = QtGui.QApplication(sys.argv) 

win = QtGui.QMainWindow() 
area = DockArea() 
win.setCentralWidget(area) 
win.resize(1000,500) 
win.setWindowTitle('pyqtgraph example: dockarea') 


d1 = Dock("Dock1") 
d2 = Dock("Dock2") 
area.addDock(d1, 'bottom') 
area.addDock(d2, 'bottom', d1) 

w1 = pg.PlotWidget(title="Dock 1 plot") 
it=w1.plot(np.random.normal(size=100)) 

d1.addWidget(w1) 

w2 = pg.PlotWidget(title="Dock 2 plot") 
w2.plot(np.random.normal(size=100)) 
d2.addWidget(w2) 

w1.sigRangeChanged.connect(onSigRangeChanged) 
w2.sigRangeChanged.connect(onSigRangeChanged) 

win.show() 

sys.exit(app.exec_()) 
Verwandte Themen