RemoteGraphicsView with a scatter plot.

68 views
Skip to first unread message

zdhughes

unread,
Aug 31, 2022, 7:26:49 PM8/31/22
to pyqtgraph
I am interested in using RemoteGraphicsView to see if it speeds up the refresh rate on some sensor data I am getting and plotting as scatter plots ( see this thread for my example program ). To start, I am trying to just modify the RemoteSpeedTest.py file to use ScatterPlotItem's instead of PlotDataItem. However, it does not seem to work. My understanding is the .plot() method of PlotItem creates a PlotDataItem and renders it (with the clear keyword clearing the previous PlotDataItem). I naively just use the additem() method to add an explicitly created ScatterPlotItem. This results in a pickle error:

TypeError: cannot pickle 'ScatterPlotItem' object

How should one use RemoteGraphicsView to create a scatter plot? Also, the local plot doesn't event work -- I assume because the explicit clear deletes the ScatterPlotItem before it is rendered? Is there a better way to clear the plot or force it to render before the lplt.clear() call? My modified RemoteSpeedTest.py is below.

Thanks,

Zach


from time import perf_counter

import numpy as np

import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtWidgets

app = pg.mkQApp()

view = pg.widgets.RemoteGraphicsView.RemoteGraphicsView()
pg.setConfigOptions(antialias=True)
view.pg.setConfigOptions(antialias=True)
view.setWindowTitle('pyqtgraph example: RemoteSpeedTest')

app.aboutToQuit.connect(view.close)

label = QtWidgets.QLabel()
rcheck = QtWidgets.QCheckBox('plot remote')
rcheck.setChecked(False) # It throws errors so disable.
lcheck = QtWidgets.QCheckBox('plot local')
lplt = pg.PlotWidget()
layout = pg.LayoutWidget()
layout.addWidget(rcheck)
layout.addWidget(lcheck)
layout.addWidget(label)
layout.addWidget(view, row=1, col=0, colspan=3)
layout.addWidget(lplt, row=2, col=0, colspan=3)
layout.resize(800,800)
layout.show()

rplt = view.pg.PlotItem()
rplt._setProxyOptions(deferGetattr=True)
view.setCentralItem(rplt)

lastUpdate = perf_counter()
avgFps = 0.0

def update():
    global check, label, plt, lastUpdate, avgFps, rpltfunc
    data = np.random.normal(size=(10000,50)).sum(axis=1)
    data += 5 * np.sin(np.linspace(0, 10, data.shape[0]))
    x = np.arange(len(data)) # Make explicit x data
   
    if rcheck.isChecked():
        # OLD:
        # rplt.plot(data, clear=True, _callSync='off')
       
        # rplt.plot() adds a plot item and clears, so make a ScatterPlotItem
        # and clear manually. This doesn't work.
        rplt.addItem(pg.ScatterPlotItem(x=x, y=data, _callSync='off'))
        rplt.clear()
       
    if lcheck.isChecked():
        # OLD:
        # lplt.plot(data, clear=True)
       
        # Nothing even displays here, does it clear before it renders?
        lplt.addItem(pg.ScatterPlotItem(x=x, y=data))
        lplt.clear()
       
    now = perf_counter()
    fps = 1.0 / (now - lastUpdate)
    lastUpdate = now
    avgFps = avgFps * 0.8 + fps * 0.2
    label.setText("Generating %0.2f fps" % avgFps)
       
timer = QtCore.QTimer()
timer.timeout.connect(update)
timer.start(0)

if __name__ == '__main__':
    pg.exec()

Reply all
Reply to author
Forward
0 new messages