如何在pyqtgraph中缩放绘图

2024-09-22 16:25:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我不知道如何操作要缩放的绘图。
此图实时绘制随机函数。
我想实时缩放指定区域的绘图。
这段代码是pyqtgraph中的示例代码。此代码适用于固定数据。
这是不是不可能的情节实时移动缩放? 你能帮帮我吗?在

# -*- coding: utf-8 -*-

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

win = pg.GraphicsWindow()
win.setWindowTitle('Scroll and Zoomed Plot')

plotScroll = win.addPlot()
plotScroll.setDownsampling(mode='peak')
plotScroll.setClipToView(True)
curveScroll = plotScroll.plot()

dataRnd = np.empty(100)
ptrDataRnd = 0

def updateScroll():
    global dataRnd, ptrDataRnd
    dataRnd[ptrDataRnd] = np.random.normal()
    ptrDataRnd += 1
    if ptrDataRnd >= dataRnd.shape[0]:
        tmp = dataRnd
        dataRnd = np.empty(dataRnd.shape[0] * 2)
        dataRnd[:tmp.shape[0]] = tmp
    curveScroll.setData(dataRnd[:ptrDataRnd])

LinRegionItem = pg.LinearRegionItem([0,100])
LinRegionItem.setZValue(-10)
plotScroll.addItem(LinRegionItem)

win.nextRow()

plotZoom = win.addPlot(title="Zoomed graph for Random plot ")
plotZoom.plot(dataRnd, pen=(255,255,255,200))

def updatePlot():
    plotZoom.setXRange(*LinRegionItem.getRegion(), padding=0)
def updateRegion():
    LinRegionItem.setRegion(plotZoom.getViewBox().viewRange()[0])
LinRegionItem.sigRegionChanged.connect(updatePlot)
plotZoom.sigXRangeChanged.connect(updateRegion)
updatePlot()

# update all plots
def update():
    updateScroll()

timer = pg.QtCore.QTimer()
timer.timeout.connect(update)
timer.start(50)

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

Tags: 代码importifplotdefnpwinpyqtgraph
2条回答

我通过添加“updateZoom()”函数解决了这个问题,该函数标记为“\added..”。
修订后的代码如下所示。
另一个问题出现在下面的控制台消息中。
原因是什么?
你能帮帮我吗?在

控制台消息:

C:\Python27\lib\site packages\pyqtgraph\graphicsItems\AxisItem.py:841:RuntimeWarning:在双标量中遇到溢出 X刻度=-边界高度()/dif
C: \Python27\lib\site packages\pyqtgraph\graphicsItems\AxisItem.py:847:RuntimeWarning:在双标量中遇到无效值 xRange=[x*xScale-x英寸的偏移量自我范围]
C: \Python27\lib\site packages\pyqtgraph\graphicsItems\AxisItem.py:871:RuntimeWarning:在双标量中遇到无效值 x=(v*x刻度)-偏移

进程结束,退出代码为0

# -*- coding: utf-8 -*-

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

app = QtGui.QApplication([])
gui = QtGui.QMainWindow()
area = DockArea()
gui.setCentralWidget(area)
gui.resize(1000,500)
gui.setWindowTitle("Scroll and Zoomed Plot")

dockCtrl = Dock("Plot Control", size=(200, 500))
dockCtrl.setFixedWidth(200)
area.addDock(dockCtrl, 'left')
winCtrl = pg.LayoutWidget()
dockCtrl.addWidget(winCtrl)

restartBttn = QtGui.QPushButton("Restart")
restartBttn.setMinimumSize(100,40)
winCtrl.addWidget(restartBttn)

def RestartPlot():
    global dataRnd,ptrDataRnd
    timer.stop()
    dataRnd = np.empty(100)
    ptrDataRnd = 0
    timer.start(50)

restartBttn.clicked.connect(RestartPlot)

dockScroll = Dock("Scrolling plot", size=(800,250))
area.addDock(dockScroll, 'right')
winScroll = pg.GraphicsWindow()
dockScroll.addWidget(winScroll)

dockZoom = Dock("Zoomed plot", size=(800,250))
area.addDock(dockZoom, 'right')
winZoom = pg.GraphicsWindow()
dockZoom.addWidget(winZoom)
area.moveDock(dockScroll, 'top', dockZoom)

plotScroll = winScroll.addPlot()
plotScroll.setDownsampling(mode='peak')
plotScroll.setClipToView(True)
curveScroll = plotScroll.plot()

dataRnd = np.empty(100)
ptrDataRnd = 0

def updateScroll():
    global dataRnd, ptrDataRnd
    dataRnd[ptrDataRnd] = np.random.normal()
    ptrDataRnd += 1
    if ptrDataRnd >= dataRnd.shape[0]:
        tmp = dataRnd
        dataRnd = np.empty(dataRnd.shape[0] * 2)
        dataRnd[:tmp.shape[0]] = tmp
    curveScroll.setData(dataRnd[:ptrDataRnd])

LinRegionItem = pg.LinearRegionItem([0,100])
LinRegionItem.setZValue(-10)
plotScroll.addItem(LinRegionItem)

plotZoom = winZoom.addPlot()
curveZoom = plotZoom.plot(dataRnd, pen=(255,255,255,200))

def updatePlot():
    plotZoom.setXRange(*LinRegionItem.getRegion(), padding=0)
def updateRegion():
    LinRegionItem.setRegion(plotZoom.getViewBox().viewRange()[0])

LinRegionItem.sigRegionChanged.connect(updatePlot)
plotZoom.sigXRangeChanged.connect(updateRegion)
updatePlot()

# added lines
def updateZoom():
    curveZoom.setData(dataRnd[:ptrDataRnd])

# update all plots
def update():
    updateScroll()
    # added line
    updateZoom()

timer = pg.QtCore.QTimer()
timer.timeout.connect(update)
timer.start(50)

gui.show()

if __name__ == '__main__':
    import sys

    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()

我也解决了这个问题。我修改了代码如下所示。在

修订前:

curveZoom.setData(dataRnd[:ptrDataRnd])  

修订代码:

^{pr2}$

我想知道纽比阵法的惯例。 “dataRnd[:ptrDataRnd]”的含义是指定从0到ptrDataRnd的范围。我错了吗? 请告诉我真相。在

相关问题 更多 >