2016-06-13 23 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

コメントありがとうございます。 「Restart」機能は以下のように解決されました。 'DEF RestartPlot(): グローバルdataRnd、ptrDataRnd #plotScroll.clear() timer.stop() dataRnd = np.empty(100) ptrDataRnd = 0 timer.start(50)' – lukas

+0

私はマークダウンスクリプトの使用に慣れていない2番目の質問の最小限の例は、この場所に挿入することはできません。そして、私は新しいソースを第2の問題に置き換えます。 – lukas

答えて

0

「#added ..」とマークされた「updateZoom()」機能を追加することでこの問題を解決しました。
改訂コードは次のとおりです。
また、次のコンソールメッセージとして別の問題が発生しました。
理由は何ですか?
私を助けてくれませんか?

コンソールメッセージ:

C:\ Python27 \ libに\のsite-packages \ 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 - self.rangeのxのオフセット]
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までの範囲を指定することです。私が間違っている? 真実を教えてください。

関連する問題