pyqtgraph:同步不同图中轴的缩放

时间:2017-06-15 20:24:49

标签: python pyqtgraph

我想同步几个pyqtgraph图的X轴。当用户使用鼠标交互重新缩放X轴时(例如,鼠标在x轴上滚轮)我想为所有其他绘图分配相同的更改。那我该怎么做?

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

我是否必须覆盖viewRangeChanged()w1的{​​{1}}功能?

w2

此问题有一个跟进here以及此问题的另一个答案。

3 个答案:

答案 0 :(得分: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_())

答案 1 :(得分:1)

更好的

可以使用blockSignals而不是先断开然后再重新连接信号。

这是同步任意数量图的通用方法:

... %>% pull(SUM)

答案 2 :(得分:1)

this question 中有更好的答案:

<块引用>

我们可以直接链接轴而不是连接到 sigRangeChanged 事件 按 w2.setXLink(w1) 缩放。