Aluode/PerceptionLabPortable
0
1import traceback2import numpy as np3 4import pyqtgraph as pg5from pyqtgraph.graphicsItems.ScatterPlotItem import name_list6from pyqtgraph.Qt import QtWidgets, QtCore7from pyqtgraph.parametertree import interact, ParameterTree, Parameter8import random9 10pg.mkQApp()11 12rng = np.random.default_rng(10)13random.seed(10)14 15 16def sortedRandint(low, high, size):17 return np.sort(rng.integers(low, high, size))18 19 20def isNoneOrScalar(value):21 return value is None or np.isscalar(value[0])22 23 24values = {25 # Convention 126 "None (replaced by integer indices)": None,27 # Convention 228 "Single curve values": sortedRandint(0, 20, 15),29 # Convention 3 list form30 "container of (optionally) mixed-size curve values": [31 sortedRandint(0, 20, 15),32 *[sortedRandint(0, 20, 15) for _ in range(4)],33 ],34 # Convention 3 array form35 "2D matrix": np.row_stack([sortedRandint(20, 40, 15) for _ in range(6)]),36}37 38 39def next_plot(xtype="random", ytype="random", symbol="o", symbolBrush="#f00"):40 constKwargs = locals()41 x = y = None42 if xtype == "random":43 xtype = random.choice(list(values))44 if ytype == "random":45 ytype = random.choice(list(values))46 x = values[xtype]47 y = values[ytype]48 textbox.setValue(f"x={xtype}\ny={ytype}")49 pltItem.clear()50 try:51 pltItem.multiDataPlot(52 x=x, y=y, pen=cmap.getLookupTable(nPts=6), constKwargs=constKwargs53 )54 except Exception as e:55 QtWidgets.QMessageBox.critical(widget, "Error", traceback.format_exc())56 57 58cmap = pg.colormap.get("viridis")59widget = pg.PlotWidget()60pltItem: pg.PlotItem = widget.plotItem61 62xytype = dict(type="list", values=list(values))63topParam = interact(64 next_plot,65 symbolBrush=dict(type="color"),66 symbol=dict(type="list", values=name_list),67 xtype=xytype,68 ytype=xytype,69)70tree = ParameterTree()71tree.setMinimumWidth(150)72tree.addParameters(topParam, showTop=True)73 74textbox = Parameter.create(name="text", type="text", readonly=True)75tree.addParameters(textbox)76 77win = QtWidgets.QWidget()78win.setLayout(lay := QtWidgets.QHBoxLayout())79lay.addWidget(widget)80lay.addWidget(tree)81if __name__ == "__main__":82 win.show()83 pg.exec()84 