dylab/HelperClasses/Plotting/Unknown.py
2022-07-30 21:50:53 +02:00

188 lines
5.5 KiB
Python

class DataPlot(QSplitter):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.setOrientation(Qt.Vertical)
self.plots = pg.GraphicsLayoutWidget()
self.addWidget(self.plots)
self.bottom = QSplitter()
self.bottom.setOrientation(Qt.Horizontal)
self.addWidget(self.bottom)
self.h5_path_shown = None
def update_from_h5(self, h5_path):
if self.h5_path_shown != h5_path or self.data_extractor.local_data_changed:
self.h5_path_shown = h5_path
self.update(*self.data_extractor.extract_data(h5_path))
class QuickDataPlot(DataPlot):
def __init__(self, ap, **kwargs):
super().__init__(**kwargs)
self.plot = self.plots.addPlot()
for key in self.plot.axes:
ax = self.plot.getAxis(key)
# Fix Z value making the grid on top of the image
ax.setZValue(1)
self.ap = ap
self.h5_paths_shown = []
self.table = QTableWidget()
self.table.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents)
self.bottom.addWidget(self.table)
self.plot_setting = PlotSettings(self.plot)
self.bottom.addWidget(self.plot_setting)
def update_from_h5(self, h5_path=None):
self.update_data_extractor()
if self.data_extractor.local_data_changed or collections.Counter(self.h5_paths_shown) != collections.Counter(
self.ap.h5_paths_selected):
self.h5_paths_shown = self.ap.h5_paths_selected
self.update()
class ExtendedCombo(QComboBox):
def __init__(self, parent=None):
super().__init__(parent)
self.setFocusPolicy(Qt.StrongFocus)
self.setEditable(True)
self.completer = QCompleter(self)
# always show all completions
self.completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion)
self.pFilterModel = QSortFilterProxyModel(self)
self.pFilterModel.setFilterCaseSensitivity(Qt.CaseInsensitive)
self.completer.setPopup(self.view())
self.setCompleter(self.completer)
self.lineEdit().textEdited[str].connect(self.pFilterModel.setFilterFixedString)
self.completer.activated.connect(self.setTextIfCompleterIsClicked)
def setModel(self, model):
super().setModel(model)
self.pFilterModel.setSourceModel(model)
self.completer.setModel(self.pFilterModel)
def setModelColumn(self, column):
self.completer.setCompletionColumn(column)
self.pFilterModel.setFilterKeyColumn(column)
super().setModelColumn(column)
def view(self):
return self.completer.popup()
def index(self):
return self.currentIndex()
def setTextIfCompleterIsClicked(self, text):
if text:
index = self.findText(text)
self.setCurrentIndex(index)
class PlotSettings(QTableWidget):
def __init__(self, plot, **kwargs):
super().__init__(**kwargs)
self.plot = plot
self.setColumnCount(3)
self.setColumnWidth(0, 100)
self.setColumnWidth(1, 100)
self.setHorizontalHeaderLabels(['parameter', 'setting', 'units'])
self.setRowCount(4)
# title
i = 0
self.le_title = QLineEdit()
self.setCellWidget(i, 0, QLabel('title'))
self.setCellWidget(i, 1, self.le_title)
self.le_title.textChanged[str].connect(self.set_title)
# xlabel
i += 1
self.le_xlabel = QLineEdit()
self.le_xlabel_unit = QLineEdit()
self.setCellWidget(i, 0, QLabel('xlabel'))
self.setCellWidget(i, 1, self.le_xlabel)
self.setCellWidget(i, 2, self.le_xlabel_unit)
self.le_xlabel.textChanged[str].connect(self.set_xlabel)
self.le_xlabel_unit.textChanged[str].connect(self.set_xlabel)
# ylabel
i += 1
self.le_ylabel = QLineEdit()
self.le_ylabel_unit = QLineEdit()
self.setCellWidget(i, 0, QLabel('ylabel'))
self.setCellWidget(i, 1, self.le_ylabel)
self.setCellWidget(i, 2, self.le_ylabel_unit)
self.le_ylabel.textChanged[str].connect(self.set_ylabel)
self.le_ylabel_unit.textChanged[str].connect(self.set_ylabel)
# grid
i += 1
self.cb_grid = QCheckBox()
self.setCellWidget(i, 0, QLabel('grid'))
self.setCellWidget(i, 1, self.cb_grid)
self.cb_grid.stateChanged.connect(self.set_grid)
def set_title(self):
self.plot.setTitle(self.le_title.text())
def set_xlabel(self):
self.plot.setLabel('bottom', self.le_xlabel.text(), units=self.le_xlabel_unit.text())
def set_ylabel(self):
self.plot.setLabel('left', self.le_ylabel.text(), units=self.le_ylabel_unit.text())
def set_grid(self):
self.plot.showGrid(x=self.cb_grid.isChecked(), y=self.cb_grid.isChecked(), alpha=0.3)
class NumericDataCombo(ExtendedCombo):
def __init__(self, df, **kwargs):
super().__init__(**kwargs)
self.update_model(df)
def update_model(self, df):
model = QtGui.QStandardItemModel()
item = QtGui.QStandardItem('shot number')
model.setItem(0, 0, item)
i = 1
for midx in df.columns:
if is_numeric_dtype(df.dtypes[midx]):
column_name = ','.join([x for x in midx if x])
item = QtGui.QStandardItem(column_name)
model.setItem(i, 0, item)
i += 1
self.setModel(model)
def get_idx(self):
return tuple(str(self.currentText()).split(','))