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

Спасибо за комментарий. Функция «Перезагрузка» была решена, как показано ниже. определение функции RestartPlot(): глобальный dataRnd, ptrDataRnd # plotScroll.clear() timer.stop() dataRnd = np.empty (100) ptrDataRnd = 0 timer.start (50) ' – lukas

+0

Я не знакомы с использованием сценариев разметки. Минимальный пример второго вопроса не может быть вставлен в это место. И я заменяю новый источник второй проблемой. – lukas

ответ

0

Я решил эту проблему с добавлением функции "updateZoom()", помеченной '# added ..'.
Пересмотренный код приведен ниже.
И еще одна проблема возникла как консольное сообщение ниже.
В чем причина?
Не могли бы вы помочь мне?

Console сообщение:

C: \ python27 \ Lib \ сайт-пакеты \ pyqtgraph \ graphicsItems \ AxisItem.py: 841: RuntimeWarning: переполнение встречается в double_scalars XScale = -bounds.height()/диф
C: \ python27 \ Lib \ сайт-пакеты \ pyqtgraph \ graphicsItems \ AxisItem.py: 847: RuntimeWarning: недопустимое значение встречается в double_scalars xRange = [х * XScale - смещение х в 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. Я ошибаюсь? Пожалуйста, скажи мне правду.

Смежные вопросы