안녕하세요 모든 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_()
왜 로거에서 데이터를 플로팅 할 때 정확히 10000 개의 색상이 필요합니까? 이 컬러 플레이 어라운드없이 플롯하면 프레임 속도에서 10 배 이상을 얻게됩니다. 필자가 가지고 있지 않은 코드를 가져올 수 있기 때문에 코드를 실행할 수 없으므로 유니 코드 색상을 사용하는 ScatterPlot에서 10000 포인트에 대해 11fps의 코드를 작성했습니다. 10000 임의의 색상과 1.0 fps. – ImportanceOfBeingErnest
Btw. 'ScatterPlot'은 속도면에서 최상의 옵션이 아닐 수도 있습니다. 예를 들어, [이 포스트] (http://stackoverflow.com/a/40139416/4124317)에서 나는 ImageImp가 100 x 100 = 10000 픽셀 인 250fps에 도달 할 수 있다는 것을 보았다. – ImportanceOfBeingErnest
그것은 10k 랜덤 색상이 아니라 z의 값으로 인한 제트 착색입니다. 데이터 로거에서 새로운 z 값을 얻을 때마다 이미 기록 된 기존 점을 다시 채색해야합니다. 한 가지 해결책은 제트 컬러를 고정 된 Z 값으로 설정하는 것이지만 컬러링은 완전히 동적이지 않습니다. – Commi