overwrite logTickValues of AaxisItem to avoid to many minor ticks; maybe closes #110

This commit is contained in:
Dominik Demuth 2023-07-29 21:25:22 +02:00
parent 141e9f810a
commit dde7b7006d

View File

@ -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<maxVal]
ticks.append((None, minor))
return ticks