From dde7b7006d3864c636d1a2c31fecd4ae384d7e8f Mon Sep 17 00:00:00 2001 From: Dominik Demuth Date: Sat, 29 Jul 2023 21:25:22 +0200 Subject: [PATCH] overwrite logTickValues of AaxisItem to avoid to many minor ticks; maybe closes #110 --- src/gui_qt/graphs/graphwindow.py | 37 +++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/gui_qt/graphs/graphwindow.py b/src/gui_qt/graphs/graphwindow.py index 72ccdb6..7540b23 100644 --- a/src/gui_qt/graphs/graphwindow.py +++ b/src/gui_qt/graphs/graphwindow.py @@ -104,6 +104,10 @@ class QGraphWindow(QtWidgets.QGraphicsView, Ui_GraphWindow): self.plotItem.ctrl.logXCheck.blockSignals(True) self.plotItem.ctrl.logYCheck.blockSignals(True) + for orient in ['top', 'bottom', 'left', 'right']: + # BAD HACK!!! but seems to work, see function for explanation + self.plotItem.getAxis(orient).logTickValues = logTickValues + for lineedit in [self.xmin_lineedit, self.xmax_lineedit, self.ymin_lineedit, self.ymax_lineedit]: lineedit.setValidator(QtGui.QDoubleValidator()) @@ -144,7 +148,7 @@ class QGraphWindow(QtWidgets.QGraphicsView, Ui_GraphWindow): tmp = [np.nan, np.nan] for j, x in enumerate(r[i]): try: - tmp[j] = 10**x + tmp[j] = 10**min(x, 199) except OverflowError: pass r[i] = tuple(tmp) @@ -423,6 +427,9 @@ class QGraphWindow(QtWidgets.QGraphicsView, Ui_GraphWindow): def set_logmode(self, xmode: bool = None, ymode: bool = None): r = self.ranges + self.plotItem.setXRange(*r[0]) + self.plotItem.setYRange(*r[1]) + if xmode is None: xmode = self.plotItem.ctrl.logXCheck.isChecked() else: @@ -766,3 +773,31 @@ class QGraphWindow(QtWidgets.QGraphicsView, Ui_GraphWindow): temp = self._fgcolor, self._bgcolor self.set_color(foreground=self._prev_colors[0], background=self._prev_colors[1]) self._prev_colors = temp + + +def logTickValues(minVal, maxVal, size, stdTicks): + # TODO FIND A BETTER SOLUTION!!! + # Sometimes minVal and maxVal are not log-scaled values and the loop from v1 to v2 is humongous, + # The minor list then fills the RAM completely and freezes everything + # Until there is a better solution, we overwrite this function for every AxesItem + # and do not draw minor ticks at all if there are too many + + # start with the tick spacing given by tickValues(). + # Any level whose spacing is < 1 needs to be converted to log scale + ticks = [] + for (spacing, t) in stdTicks: + if spacing >= 1.0: + ticks.append((spacing, t)) + + if len(ticks) < 3: + v1 = int(np.floor(minVal)) + v2 = int(np.ceil(maxVal)) + # major = list(range(v1+1, v2)) + minor = [] + + if v2 - v1 < 400: + for v in range(v1, v2): + minor.extend(v + np.log10(np.arange(1, 10))) + minor = [x for x in minor if x>minVal and x