2016-11-12 3 views
0

안녕하세요 모든 PyQtGraph 사용자PyQtGraph 및 ScatterPlotItem (> 1 fps)으로 그래프를 빠르게 업데이트하려면 어떻게합니까?

데이터 로거의 데이터를 사용하여 실시간 그래프 업데이트를 위해 pg.ScatterPlotItem에서 Matplotlibs jet 색상을 사용하려고합니다. 나는 다음과 같은 몇 줄 RGBA 코드에 제트 색상을 변환 : 나는 점의 수는 10,000 이상인 경우 산점도 업데이트의 속도가 문제가 될 수있는 것으로 나타났습니다

z=np.random.randint(0,10000,10000) #random z value 
norm = mpl.colors.Normalize(vmin=min(z), vmax=max(z)) 
m = cm.ScalarMappable(norm=norm, cmap=cm.jet) 
colors = m.to_rgba(z, bytes=True) 

. 예를 들어, 내 랩톱에서 ScatterplotTestSpeed.py에서 예제 코드를 실행하면 10k 포인트에 대해 0.16fps의 업데이트 속도를 얻습니다. 이상이있는 경우이 내가 간단한 시도에 의해 발견 및 방법을 참조 작은 트릭

colors_=[] 
for i in colors: 
    colors_.append(pg.mkBrush(tuple(i))) 

,하지만 궁금 해서요 : 나는 튜플으로 목록을 추가 할 경우, 나는 0.45 FPS에 업데이트 속도를 세 겹으로 할 수 있습니다 그런 속임수는 fps 수를 빠르게하기 위해?!

업데이트 속도를 테스트하는 전체 코드는 다음과 같습니다. 이것은 ScatterPlotSpeedTest.py 양식 pyqtgraphs 예제 라이브러리를 기반으로합니다. 어떤 도움을 주셔서 감사합니다 :-)

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
""" 
For testing rapid updates of ScatterPlotItem under various conditions. 

(Scatter plots are still rather slow to draw; expect about 20fps) 
""" 



## Add path to library (just for examples; you do not need this) 
import initExample 

import matplotlib as mpl 
import matplotlib.cm as cm 
from pyqtgraph.Qt import QtGui, QtCore, USE_PYSIDE 
import numpy as np 
import pyqtgraph as pg 
from pyqtgraph.ptime import time 
#QtGui.QApplication.setGraphicsSystem('raster') 
app = QtGui.QApplication([]) 
#mw = QtGui.QMainWindow() 
#mw.resize(800,800) 
if USE_PYSIDE: 
    from ScatterPlotSpeedTestTemplate_pyside import Ui_Form 
else: 
    from ScatterPlotSpeedTestTemplate_pyqt import Ui_Form 

win = QtGui.QWidget() 
win.setWindowTitle('pyqtgraph example: ScatterPlotSpeedTest') 
ui = Ui_Form() 
ui.setupUi(win) 
win.show() 

p = ui.plot 
p.setRange(xRange=[-500, 500], yRange=[-500, 500]) 

data = np.random.normal(size=(50,10000), scale=100) 
sizeArray = (np.random.random(500) * 20.).astype(int) 
ptr = 0 
lastTime = time() 
fps = None 
def update(): 
    global curve, data, ptr, p, lastTime, fps 
    p.clear() 
    if ui.randCheck.isChecked(): 
     size = sizeArray 
    else: 
     size = ui.sizeSpin.value() 


    z=np.random.randint(0,10000,10000) 
    norm = mpl.colors.Normalize(vmin=min(z), vmax=max(z)) 
    m = cm.ScalarMappable(norm=norm, cmap=cm.jet) 
    colors = m.to_rgba(z, bytes=True) 

    colors_=[] 
    for i in colors: 
     colors_.append(pg.mkBrush(tuple(i))) 
     #colors.append(pg.intColor(np.random.randint(0,255), 100)) 

    curve = pg.ScatterPlotItem(x=data[ptr%50], y=data[(ptr+1)%50], 
        pen='w', brush=colors_, size=size, 
        pxMode=ui.pixelModeCheck.isChecked()) 


    ''' 
    curve = pg.ScatterPlotItem(pen='w', size=size, pxMode=ui.pixelModeCheck.isChecked()) 
    spots3=[] 

    for i,j,k in zip(data[ptr%50],data[(ptr+1)%50],colors): 
     spots3.append({'pos': (i, j), 'brush':pg.mkBrush(tuple(k))}) 

    curve.addPoints(spots3) 
    ''' 



    p.addItem(curve) 
    ptr += 1 
    now = time() 
    dt = now - lastTime 
    lastTime = now 
    if fps is None: 
     fps = 1.0/dt 
    else: 
     s = np.clip(dt*3., 0, 1) 
     fps = fps * (1-s) + (1.0/dt) * s 
    p.setTitle('%0.2f fps' % fps) 
    p.repaint() 
    #app.processEvents() ## force complete redraw for every plot 
timer = QtCore.QTimer() 
timer.timeout.connect(update) 
timer.start(0) 



## Start Qt event loop unless running in interactive mode. 
if __name__ == '__main__': 
    import sys 
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): 
     QtGui.QApplication.instance().exec_() 
+0

왜 로거에서 데이터를 플로팅 할 때 정확히 10000 개의 색상이 필요합니까? 이 컬러 플레이 어라운드없이 플롯하면 프레임 속도에서 10 배 이상을 얻게됩니다. 필자가 가지고 있지 않은 코드를 가져올 수 있기 때문에 코드를 실행할 수 없으므로 유니 코드 색상을 사용하는 ScatterPlot에서 10000 포인트에 대해 11fps의 코드를 작성했습니다. 10000 임의의 색상과 1.0 fps. – ImportanceOfBeingErnest

+0

Btw. 'ScatterPlot'은 속도면에서 최상의 옵션이 아닐 수도 있습니다. 예를 들어, [이 포스트] (http://stackoverflow.com/a/40139416/4124317)에서 나는 ImageImp가 100 x 100 = 10000 픽셀 인 250fps에 도달 할 수 있다는 것을 보았다. – ImportanceOfBeingErnest

+0

그것은 10k 랜덤 색상이 아니라 z의 값으로 인한 제트 착색입니다. 데이터 로거에서 새로운 z 값을 얻을 때마다 이미 기록 된 기존 점을 다시 채색해야합니다. 한 가지 해결책은 제트 컬러를 고정 된 Z 값으로 설정하는 것이지만 컬러링은 완전히 동적이지 않습니다. – Commi

답변

0

나는 내 문제에 대한 해결책을 찾았다 고 생각합니다. ScatterPlotItem은 '브러시'로 지정된 여러 색상으로 많은 수의 점 (> 500)을 연속적으로 다시 그리는 데 너무 느립니다. 대신, 나는 plotItem과 'symbolBrush'를 사용하여 Jet 색상으로 들어오는 데이터 포인트를 색칠합니다 (처음에는 2.5D 플롯을 찾았습니다). 플롯 업데이트 속도는 추가되는 데이터 수에 관계없이 거의 순간적으로 나타납니다. 100 포인트는 10000 포인트만큼 빨리 (사용자 관점에서) 다시 채색됩니다.