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

标签 python pyqtgraph

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

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

我是否必须覆盖 viewRangeChanged() w1 的功能和 w2 ?

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这个问题的另一个答案。

最佳答案

我们需要使用 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_())

关于python - pyqtgraph:同步不同图中轴的缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44576435/

相关文章:

python - 提高在二维 numpy 数组中查找最小元素的速度,该数组有许多条目设置为 np.inf

python - pyqt图: how to know the size of a TextItem?

python - 如何在 PyQt5 中设置 PlotWidget 刻度颜色?

python - PyQtGraph 中的图形在缩放后未更新

python - 如何清除 PYQTGRAPH 中的 ScatterPlotItem

python - 如何在 python 中插入地理引用数据?

python - 为什么 `len(l) != 0` 在 CPython 中比 `bool(l)` 快?

python - 迭代一定次数而不将迭代次数存储在任何地方

python - 专门使用正则表达式或语句进行字符串操作

python - pyqtgraph:如何拖动绘图项