def divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize): ''' Reimplements Qwt5.QwtLinearScaleEngine.divideScale **Important**: The stepSize parameter is **ignored**. :return: (Qwt5.QwtScaleDiv) a scale division whose ticks are aligned with the natural time units ''' interval = Qwt5.QwtDoubleInterval(x1, x2).normalized() if interval.width() <= 0: return Qwt5.QwtScaleDiv() #dt1=datetime.fromtimestamp(interval.minValue()) #dt2=datetime.fromtimestamp(interval.maxValue()) #if dt1.year<1900 or dt2.year>9999 : #limits in time.mktime and datetime # return Qwt5.QwtScaleDiv() i1 = int(x1) i2 = int(x2) medticks = [] minticks = [] # major ticks if x2 > x1 + 15.01: # if greater than two weeks i1 += (3 - (i1 % 7)) majticks = [float(i) for i in range(i1, i2, 7)] elif x2 > x1 + 1.01: # if greater than a day majticks = [float(i) for i in range(i1, i2 + 1)] else: # if less than a day majticks = [float(i1)] for i in range(i1, i2 + 1): majticks.extend(self.dayrange + float(i)) i1 = int(x1) i2 = int(x2) # minor ticks if x2 > x1 + 30.01: # if greater than a month(ish) i1 += (3 - (i1 % 7)) minticks = [float(i) for i in range(i1, i2, 7)] elif x2 > x1 + 1.01: # if greater than a day minticks = [float(i) for i in range(i1, i2 + 1)] # make sure to comply with maxMajTicks L = len(majticks) if L > maxMajSteps: majticks = majticks[::int(np.ceil(float(L) / maxMajSteps))] scaleDiv = Qwt5.QwtScaleDiv(interval, minticks, medticks, majticks) #self.scaleDraw().setDatetimeLabelFormat(format) if x1 > x2: scaleDiv.invert() return scaleDiv
def divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize): ''' Reimplements Qwt5.QwtLinearScaleEngine.divideScale :return: (Qwt5.QwtScaleDiv) a scale division whose ticks are aligned with the natural delta time units ''' interval = Qwt5.QwtDoubleInterval(x1, x2).normalized() if interval.width() <= 0: return Qwt5.QwtScaleDiv() d_range = interval.width() if d_range < 2: # 2s return Qwt5.QwtLinearScaleEngine.divideScale( self, x1, x2, maxMajSteps, maxMinSteps, stepSize) elif d_range < 20: # 20 s s = 1 elif d_range < 120: # =60s*2 = 2 minutes s = 10 elif d_range < 1200: # 60s*20 =20 minutes s = 60 elif d_range < 7200: # 3600s*2 = 2 hours s = 600 elif d_range < 172800: # 3600s24*2 = 2 days s = 3600 else: s = 86400 #1 day #calculate a step size that respects the base step (s) and also enforces the maxMajSteps stepSize = s * int(np.ceil(float(d_range // s) / maxMajSteps)) return Qwt5.QwtLinearScaleEngine.divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize)
def setScale(self, scale): ''' Change the display scaling @param scale: new scale value in µV/Div ''' self.scale = scale ticks = np.arange(0.0, scale * 11.0, scale).tolist() yScaleDiv = Qwt.QwtScaleDiv(0.0, scale * 10.0, [], ticks, []) self.plotscale.setScaleDiv(yScaleDiv) self.replot()
def divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize): interval = Qwt.QwtDoubleInterval(x1, x2).normalized() interval = interval.limited(LOG2_MIN, LOG2_MAX) if interval.width() <= 0: return Qwt.QwtScaleDiv() base = 2. if interval.maxValue() / interval.minValue() < base: # scale width is less than one octave -> build linear scale linearScaler = Qwt.QwtLinearScaleEngine() linearScaler.setAttributes(self.attributes()) linearScaler.setReference(self.reference()) linearScaler.setMargins(self.lowerMargin(), self.upperMargin()) return linearScaler.divideScale(x1, x2, maxMajSteps, maxMinSteps, stepSize) stepSize = abs(stepSize) if stepSize == 0.: if maxMajSteps < 1: maxMajSteps = 1 stepSize = self.divideInterval( self.log2(interval).width(), maxMajSteps) if stepSize < 1.: stepSize = 1. # major step must be >= 1 decade scaleDiv = Qwt.QwtScaleDiv() if stepSize <> 0.: ticks = self.buildTicks(interval, stepSize, maxMinSteps) scaleDiv = Qwt.QwtScaleDiv(interval, ticks[0], ticks[1], ticks[2]) if x1 > x2: scaleDiv.invert() return scaleDiv
def divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize=0.0): div = Qwt5.QwtScaleDiv(x1, x2, self._positions, [], []) div.setTicks(Qwt5.QwtScaleDiv.MajorTick, self._positions) return div
def divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize): ''' Reimplements Qwt5.QwtLinearScaleEngine.divideScale **Important**: The stepSize parameter is **ignored**. :return: (Qwt5.QwtScaleDiv) a scale division whose ticks are aligned with the natural time units ''' #if stepSize != 0: # scaleDiv = Qwt5.QwtLinearScaleEngine.divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize) # scaleDiv.datetimeLabelFormat = "%Y/%m/%d %H:%M%S.%f" # return scaleDiv interval = Qwt5.QwtDoubleInterval(x1, x2).normalized() if interval.width() <= 0: return Qwt5.QwtScaleDiv() dt1 = datetime.fromtimestamp(interval.minValue()) dt2 = datetime.fromtimestamp(interval.maxValue()) if dt1.year < 1900 or dt2.year > 9999: #limits in time.mktime and datetime return Qwt5.QwtScaleDiv() majticks = [] medticks = [] minticks = [] dx = interval.width() #if dx > 63072001: # = 3600s*24*(365+366) = 2 years (counting a leap year) # format = "%Y" # for y in range(dt1.year+1,dt2.year): # dt = datetime(year=y, month=1, day=1) # majticks.append(mktime(dt.timetuple())) #elif dx > 5270400: # = 3600s*24*61 = 61 days # format = "%Y %b" # d = timedelta(days=31) # dt = dt1.replace(day=1, hour=0, minute=0, second=0, microsecond=0)+d # while(dt<dt2): # dt = dt.replace(day=1) #make sure that we are on day 1 (even if always sum 31 days) # majticks.append(mktime(dt.timetuple())) # dt += d #elif dx > 172800: # 3600s24*2 = 2 days # put this back in if dx > 86400: # 1 day format = "%m-%d %H:%M" d = timedelta(hours=1) dt = dt1.replace(hour=0, minute=0, second=0, microsecond=0) + d while (dt < dt2): if dt.hour >= 9 and dt.hour <= 16: majticks.append(mktime(dt.timetuple())) dt += d #elif dx > 7200: # 3600s*2 = 2hours # format = "%b/%d-%Hh" # d = timedelta(hours=1) # dt = dt1.replace(minute=0, second=0, microsecond=0) + d # while(dt<dt2): # majticks.append(mktime(dt.timetuple())) # dt += d #elif dx > 1200: # 60s*20 =20 minutes # format = "%H:%M" # d = timedelta(minutes=10) # dt = dt1.replace(minute=(dt1.minute//10)*10, second=0, microsecond=0) + d # while(dt<dt2): # majticks.append(mktime(dt.timetuple())) # dt += d #elif dx > 120: # =60s*2 = 2 minutes else: format = "%H:%M" d = timedelta(hours=1) dt = dt1.replace(minute=0, second=0, microsecond=0) + d while (dt < dt2): majticks.append(mktime(dt.timetuple())) dt += d #elif dx > 20: # 20 s # format = "%H:%M:%S" # d = timedelta(seconds=10) # dt = dt1.replace(second=(dt1.second//10)*10, microsecond=0) + d # while(dt<dt2): # majticks.append(mktime(dt.timetuple())) # dt += d #elif dx > 2: # 2s # format = "%H:%M:%S" # majticks=range(int(x1)+1, int(x2)) #else: #less than 2s (show microseconds) # scaleDiv = Qwt5.QwtLinearScaleEngine.divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize) # self.scaleDraw().setDatetimeLabelFormat("%S.%f") # return scaleDiv #make sure to comply with maxMajTicks L = len(majticks) if L > maxMajSteps: majticks = majticks[::int(np.ceil(float(L) / maxMajSteps))] scaleDiv = Qwt5.QwtScaleDiv(interval, minticks, medticks, majticks) self.scaleDraw().setDatetimeLabelFormat(format) if x1 > x2: scaleDiv.invert() ##START DEBUG #print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" #for tk in scaleDiv.ticks(scaleDiv.MajorTick): # print datetime.fromtimestamp(tk).isoformat() #print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" ##END DEBUG return scaleDiv