Skip to content

Commit 73197b6

Browse files
author
Pierre Raybaut
committed
Fixed and added support for QwtLogScaleEngine (<=> QwtLog10ScaleEngine in Qwt5)
1 parent f67a77e commit 73197b6

File tree

5 files changed

+30
-34
lines changed

5 files changed

+30
-34
lines changed

qwt/__init__.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from qwt.qwt_plot import QwtPlot
55
from qwt.qwt_symbol import QwtSymbol
6-
from qwt.qwt_scale_engine import QwtLinearScaleEngine
6+
from qwt.qwt_scale_engine import QwtLinearScaleEngine, QwtLogScaleEngine
77
from qwt.qwt_text import QwtText
88
from qwt.qwt_plot_canvas import QwtPlotCanvas
99
from qwt.qwt_plot_curve import QwtPlotCurve, QwtPlotItem
@@ -27,8 +27,6 @@
2727
QwtDoubleInterval = QwtInterval
2828

2929
# to be implemented:
30-
# QwtLog10ScaleEngine, QwtPlotPrintFilter
31-
class QwtLog10ScaleEngine(object):
32-
pass
30+
# QwtPlotPrintFilter
3331
class QwtPlotPrintFilter(object):
3432
pass

qwt/qwt_point_mapper.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,8 @@ def qwtToPointsFiltered(boundingRect, xMap, yMap, series, from_, to,
100100
points = []
101101
for i in range(from_, to+1):
102102
sample = series.sample(i)
103-
x = round(xMap.transform(sample.x()))
104-
y = round(yMap.transform(sample.y()))
103+
x = int(round(xMap.transform(sample.x())))
104+
y = int(round(yMap.transform(sample.y())))
105105
points.append(Point(x, y))
106106
return Polygon(list(set(points)))
107107

qwt/qwt_scale_draw.py

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from qwt.qt.QtCore import (Qt, qFuzzyCompare, QLocale, QRectF, QPointF, QRect,
1111
QPoint)
1212

13-
from math import ceil, sin, pi, cos
13+
import numpy as np
1414

1515

1616
class QwtAbstractScaleDraw_PrivateData(object):
@@ -233,8 +233,8 @@ def getBorderDistHint(self, font):
233233
maxTick = tick
234234
maxPos = tickPos
235235

236-
e = 0.
237236
s = 0.
237+
e = 0.
238238
if self.orientation() == Qt.Vertical:
239239
s = -self.labelRect(font, minTick).top()
240240
s -= abs(minPos - round(self.scaleMap().p2()))
@@ -248,13 +248,7 @@ def getBorderDistHint(self, font):
248248
e = self.labelRect(font, maxTick).right()
249249
e -= abs(maxPos - self.scaleMap().p2())
250250

251-
if s < 0.:
252-
s = 0.
253-
if e < 0.:
254-
e = 0.
255-
256-
start = ceil(s)
257-
end = ceil(e)
251+
start, end = np.ceil(np.nan_to_num(np.array([s, e])).clip(0, None))
258252
return start, end
259253

260254
def minLabelDist(self, font):
@@ -294,15 +288,15 @@ def minLabelDist(self, font):
294288

295289
angle = qwtRadians(self.labelRotation())
296290
if vertical:
297-
angle += pi/2
291+
angle += np.pi/2
298292

299-
sinA = sin(angle)
293+
sinA = np.sin(angle)
300294
if qFuzzyCompare(sinA+1., 1.):
301-
return ceil(maxDist)
295+
return np.ceil(maxDist)
302296

303297
fmHeight = fm.ascent()-2
304298

305-
labelDist = fmHeight/sin(angle)*cos(angle)
299+
labelDist = fmHeight/np.sin(angle)*np.cos(angle)
306300
if labelDist < 0:
307301
labelDist = -labelDist
308302

@@ -312,7 +306,7 @@ def minLabelDist(self, font):
312306
if labelDist < fmHeight:
313307
labelDist = fmHeight
314308

315-
return ceil(labelDist)
309+
return np.ceil(labelDist)
316310

317311
def extent(self, font):
318312
d = 0.
@@ -342,7 +336,7 @@ def minLength(self, font):
342336
lengthForTicks = 0
343337
if self.hasComponent(QwtAbstractScaleDraw.Ticks):
344338
pw = max([1, self.penWidth()])
345-
lengthForTicks = ceil((majorCount+minorCount)*(pw+1.))
339+
lengthForTicks = np.ceil((majorCount+minorCount)*(pw+1.))
346340
return startDist + endDist + max([lengthForLabels, lengthForTicks])
347341

348342
def labelPosition(self, value):
@@ -553,15 +547,15 @@ def maxLabelWidth(self, font):
553547
ticks = self.scaleDiv().ticks(QwtScaleDiv.MajorTick)
554548
if not ticks:
555549
return 0
556-
return ceil(max([self.labelSize(font, v).width()
557-
for v in ticks if self.scaleDiv().contains(v)]))
550+
return np.ceil(max([self.labelSize(font, v).width()
551+
for v in ticks if self.scaleDiv().contains(v)]))
558552

559553
def maxLabelHeight(self, font):
560554
ticks = self.scaleDiv().ticks(QwtScaleDiv.MajorTick)
561555
if not ticks:
562556
return 0
563-
return ceil(max([self.labelSize(font, v).height()
564-
for v in ticks if self.scaleDiv().contains(v)]))
557+
return np.ceil(max([self.labelSize(font, v).height()
558+
for v in ticks if self.scaleDiv().contains(v)]))
565559

566560
def updateMap(self):
567561
pos = self.__data.pos

qwt/qwt_scale_engine.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# -*- coding: utf-8 -*-
22

3+
from __future__ import division
4+
35
from qwt.qwt_interval import QwtInterval
46
from qwt.qwt_scale_div import QwtScaleDiv
57
from qwt.qwt_transform import QwtLogTransform
@@ -251,7 +253,7 @@ def buildMinorTicks(self, ticks, maxMinorSteps, stepSize):
251253
if numTicks % 2:
252254
medIndex = numTicks/2
253255
for val in ticks[QwtScaleDiv.MajorTick]:
254-
for k in range(int(numTicks)):
256+
for k in range(numTicks):
255257
val += minStep
256258
alignedValue = val
257259
if qwtFuzzyCompare(val, 0., stepSize) == 0:
@@ -305,7 +307,7 @@ def autoScale(self, maxNumSteps, x1, x2, stepSize):
305307
stepSize = qwtLog(logBase, stepSize)
306308
return x1, x2, stepSize
307309

308-
logRef = -1.
310+
logRef = 1.
309311
if self.reference() > LOG_MIN/2:
310312
logRef = min([self.reference(), LOG_MAX/2])
311313

@@ -315,7 +317,9 @@ def autoScale(self, maxNumSteps, x1, x2, stepSize):
315317
interval.setInterval(logRef/delta, logRef*delta)
316318

317319
if self.testAttribute(QwtScaleEngine.IncludeReference):
318-
interval = interval.limited(LOG_MIN, LOG_MAX)
320+
interval = interval.extend(logRef)
321+
322+
interval = interval.limited(LOG_MIN, LOG_MAX)
319323

320324
if interval.width() == 0.:
321325
interval = self.buildInterval(interval.minValue())
@@ -391,7 +395,7 @@ def buildTicks(self, interval, stepSize, maxMinorSteps):
391395

392396
def buildMajorTicks(self, interval, stepSize):
393397
width = qwtLogInterval(self.base(), interval).width()
394-
numTicks = min([round(width/stepSize)+1, 10000])
398+
numTicks = min([int(round(width/stepSize))+1, 10000])
395399

396400
lxmin = np.log(interval.minValue())
397401
lxmax = np.log(interval.maxValue())
@@ -411,7 +415,7 @@ def buildMinorTicks(self, ticks, maxMinorSteps, stepSize):
411415
if minStep == 0.:
412416
return
413417

414-
numSteps = round(stepSize/minStep)
418+
numSteps = int(round(stepSize/minStep))
415419

416420
mediumTickIndex = -1
417421
if numSteps > 2 and numSteps % 2 == 0:
@@ -425,7 +429,7 @@ def buildMinorTicks(self, ticks, maxMinorSteps, stepSize):
425429
for j in range(2, numSteps):
426430
ticks[QwtScaleDiv.MinorTick] += [v*j*s]
427431
else:
428-
for j in range(2, numSteps):
432+
for j in range(1, numSteps):
429433
tick = v + j*v*(logBase-1)/numSteps
430434
if j == mediumTickIndex:
431435
ticks[QwtScaleDiv.MediumTick] += [tick]
@@ -440,7 +444,7 @@ def buildMinorTicks(self, ticks, maxMinorSteps, stepSize):
440444
if minStep < 1.:
441445
minStep = 1.
442446

443-
numTicks = round(stepSize/minStep)-1
447+
numTicks = int(round(stepSize/minStep))-1
444448

445449
if qwtFuzzyCompare((numTicks+1)*minStep, stepSize, stepSize) > 0:
446450
numTicks = 0
@@ -465,7 +469,7 @@ def buildMinorTicks(self, ticks, maxMinorSteps, stepSize):
465469
def align(self, interval, stepSize):
466470
intv = qwtLogInterval(self.base(), interval)
467471

468-
x1 = floorEps(intv.maxValue(), stepSize)
472+
x1 = floorEps(intv.minValue(), stepSize)
469473
if qwtFuzzyCompare(interval.minValue(), x1, stepSize) == 0:
470474
x1 = interval.minValue()
471475

qwt/qwt_transform.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class QwtLogTransform(QwtTransform):
3535
LogMin = 1.0e-150
3636
LogMax = 1.0e150
3737
def bounded(self, value):
38-
return max([self.LogMin, min([value, self.LogMax])])
38+
return np.clip(value, self.LogMin, self.LogMax)
3939

4040
def transform(self, value):
4141
return np.log(value)

0 commit comments

Comments
 (0)