2016-06-13 37 views
-1

我不知道如何操作陰謀被放大。
該圖實時繪製隨機函數。
我想爲指定區域實時縮放圖。
此代碼是pyqtgraph中的示例代碼。此代碼適用於固定數據。
情節不可能實時移動以進行縮放嗎? 你能幫我嗎?如何放大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_() 
+0

請提供一個顯示問題的最簡單**示例。你也意味着重新啓動? – Trilarion

+0

感謝您的評論。 「重新啓動」功能已解決,如下所示。 'DEF RestartPlot(): 全球dataRnd,ptrDataRnd #plotScroll.clear() timer.stop() dataRnd = np.empty(100) ptrDataRnd = 0 timer.start(50)' – lukas

+0

我不熟悉使用markdown腳本。第二個問題的最小例子不能被插入到這個地方。我用第二個問題替換新來源。 – lukas

回答

0

我解決了這個問題,添加了「updateZoom()」功能,標記爲'#added ..'。
修改後的代碼如下所示。
下面的控制檯消息出現了另一個問題。
是什麼原因?
你能幫我嗎?

控制檯消息:

C:\ Python27 \ lib中\站點包\ pyqtgraph \ graphicsItems \ AxisItem.py:841:RuntimeWarning:在double_scalars遇到 xScale等= -bounds.height溢出()/ DIF
C:\ Python27 \ lib \ site-packages \ pyqtgraph \ graphicsItems \ AxisItem.py:847:RuntimeWarning:在double_scalars中遇到無效值 xRange = [x * xScale - x在self.range中的偏移量]
C:\ Python27 \ lib \ site-packages \ pyqtgraph \ graphicsItems \ AxisItem.py:871:RuntimeWarning:在double_scalars中遇到無效值 x =(v * xScale) - 偏移量

過程,退出代碼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_() 
0

完成我也解決了這個問題。我修改了代碼,如下圖所示。

修訂前:

curveZoom.setData(dataRnd[:ptrDataRnd]) 

修改後的代碼:

curveZoom.setData(dataRnd[0:ptrDataRnd]) 

我不知道numpy的陣列的約定。 「dataRnd [:ptrDataRnd]」的含義是指定從0到ptrDataRnd的範圍。我錯了嗎? 請告訴我真相。