2017-06-15 20 views
0

我想同步几个pyqtgraph图的X轴。当用户使用鼠标交互重新调整X轴(例如,在x轴上使用鼠标滚动鼠标滚轮时),我想将相同的更改分配给所有其他图。那么,我该如何做到这一点?pyqtgraph:同步不同图中轴的缩放

我从下面的基本示例中推导出最小化的代码。

是否必须覆盖w1w2viewRangeChanged()功能?

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

这个问题有一个跟进here与此问题的另一个答案。

回答

2

我们需要使用sigRangeChanged信号并将其连接到一个插槽,问题在于改变另一个项目的范围会产生信号sigRangeChanged等等产生无限循环,要解决这个问题,您必须断开这些信号然后再进行修改并重新连接到最终。

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) 

实施例:

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