GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.

Orange.widgets.utils.plot.OWAxis.update()   F
last analyzed

Complexity

Conditions 31

Size

Total Lines 139

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 31
dl 0
loc 139
rs 2

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

Complexity

Complex classes like Orange.widgets.utils.plot.OWAxis.update() often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
"""
2
    The Axis class display an axis on a graph
3
4
    The axis contains a line with configurable style, possible arrows, and a title
5
6
    .. attribute:: line_style
7
        The LineStyle with which the axis line is drawn
8
9
    .. attribute:: title
10
        The string to be displayed alongside the axis
11
12
    .. attribute:: title_above
13
        A boolean which specifies whether the title should be placed above or below the axis
14
        Normally the title would be above for top and left axes.
15
16
    .. attribute:: title_location
17
        can either be AxisStart, AxisEnd or AxisMiddle. The default is AxisMiddle
18
19
    .. attribute:: arrows
20
        A bitfield containing AxisEnd if an arrow should be drawn at the line's end (line.p2())
21
        and AxisStart if there should be an arrows at the first point.
22
23
        By default, there's an arrow at the end of the line
24
25
    .. attribute:: zoomable
26
        If this is set to True, the axis line will zoom together with the rest of the graph.
27
        Otherwise, the line will remain in place and only tick marks will zoom.
28
29
    .. method:: make_title
30
        Makes a pretty title, with the quantity title in italics and the unit in normal text
31
32
    .. method:: label_pos
33
        Controls where the axis title and tick marks are placed relative to the axis
34
"""
35
36
from math import *
0 ignored issues
show
Bug Best Practice introduced by
This seems to re-define the built-in pow.

It is generally discouraged to redefine built-ins as this makes code very hard to read.

Loading history...
Coding Style introduced by
The usage of wildcard imports like math should generally be avoided.
Loading history...
Unused Code introduced by
erfc was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
hypot was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
degrees was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
asin was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
sqrt was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
sin was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
acosh was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
copysign was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
fabs was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
expm1 was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
frexp was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
cos was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
fmod was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
ldexp was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
pi was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
asinh was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
isfinite was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
e was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
atanh was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
isnan was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
lgamma was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
acos was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
factorial was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
log1p was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
atan2 was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
atan was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
log was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
isinf was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
tan was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
cosh was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
trunc was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
sinh was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
floor was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
exp was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
radians was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
gamma was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
tanh was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
modf was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
erf was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
fsum was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
log2 was imported with wildcard, but is not used.
Loading history...
37
38
from PyQt4.QtGui import QGraphicsItem, QGraphicsLineItem, QGraphicsTextItem, QPainterPath, QGraphicsPathItem, \
0 ignored issues
show
Configuration introduced by
The import PyQt4.QtGui could not be resolved.

This can be caused by one of the following:

1. Missing Dependencies

This error could indicate a configuration issue of Pylint. Make sure that your libraries are available by adding the necessary commands.

# .scrutinizer.yml
before_commands:
    - sudo pip install abc # Python2
    - sudo pip3 install abc # Python3
Tip: We are currently not using virtualenv to run pylint, when installing your modules make sure to use the command for the correct version.

2. Missing __init__.py files

This error could also result from missing __init__.py files in your module folders. Make sure that you place one file in each sub-folder.

Loading history...
39
    QTransform, QGraphicsRectItem, QPen, QFontMetrics
40
from PyQt4.QtCore import QLineF, QPointF, QRectF, Qt
0 ignored issues
show
Configuration introduced by
The import PyQt4.QtCore could not be resolved.

This can be caused by one of the following:

1. Missing Dependencies

This error could indicate a configuration issue of Pylint. Make sure that your libraries are available by adding the necessary commands.

# .scrutinizer.yml
before_commands:
    - sudo pip install abc # Python2
    - sudo pip3 install abc # Python3
Tip: We are currently not using virtualenv to run pylint, when installing your modules make sure to use the command for the correct version.

2. Missing __init__.py files

This error could also result from missing __init__.py files in your module folders. Make sure that you place one file in each sub-folder.

Loading history...
41
42
from .owconstants import *
0 ignored issues
show
Coding Style introduced by
The usage of wildcard imports like owconstants should generally be avoided.
Loading history...
Unused Code introduced by
SelectionZValue was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
SELECT_POLYGON was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
SELECT_RIGHTCLICK was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
HighlightZValue was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
SELECTION_REPLACE was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
SELECTION_TOGGLE was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
NoPosition was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
NOTHING was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
yLeft was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
ROTATING was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
PANNING was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
LegendZValue was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
xBottom was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
CartesianAxes was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
SELECTION_ADD was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
PlotZValue was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
SELECT was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
UserAxis was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
TitleBelow was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
SELECT_RECTANGLE was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
ProbabilitiesZValue was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
yRight was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
TitleAbove was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
SELECTION_REMOVE was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
xTop was imported with wildcard, but is not used.
Loading history...
Unused Code introduced by
ZOOMING was imported with wildcard, but is not used.
Loading history...
43
from .owtools import resize_plot_item_list
44
from .owpalette import OWPalette
45
46
47
class OWAxis(QGraphicsItem):
48
    Role = OWPalette.Axis
49
50
    def __init__(self, id, title='', title_above=False, title_location=AxisMiddle,
0 ignored issues
show
Bug Best Practice introduced by
This seems to re-define the built-in id.

It is generally discouraged to redefine built-ins as this makes code very hard to read.

Loading history...
51
                 line=None, arrows=0, plot=None, bounds=None):
52
        QGraphicsItem.__init__(self)
53
        self.setFlag(QGraphicsItem.ItemHasNoContents)
54
        self.setZValue(AxisZValue)
55
        self.id = id
56
        self.title = title
57
        self.title_location = title_location
58
        self.data_line = line
59
        self.plot = plot
60
        self.graph_line = None
61
        self.size = None
62
        self.scale = None
63
        self.tick_length = (10, 5, 0)
64
        self.arrows = arrows
65
        self.title_above = title_above
66
        self.line_item = QGraphicsLineItem(self)
67
        self.title_item = QGraphicsTextItem(self)
68
        self.end_arrow_item = None
69
        self.start_arrow_item = None
70
        self.show_title = False
71
        self.scale = None
72
        path = QPainterPath()
73
        path.setFillRule(Qt.WindingFill)
74
        path.moveTo(0, 3.09)
75
        path.lineTo(0, -3.09)
76
        path.lineTo(9.51, 0)
77
        path.closeSubpath()
78
        self.arrow_path = path
79
        self.label_items = []
80
        self.label_bg_items = []
81
        self.tick_items = []
82
        self._ticks = []
83
        self.zoom_transform = QTransform()
84
        self.labels = None
85
        self.values = None
86
        self._bounds = bounds
87
        self.auto_range = None
88
        self.auto_scale = True
89
90
        self.zoomable = False
91
        self.update_callback = None
92
        self.max_text_width = 50
93
        self.text_margin = 5
94
        self.always_horizontal_text = False
95
96
    @staticmethod
97
    def compute_scale(min, max):
0 ignored issues
show
Bug Best Practice introduced by
This seems to re-define the built-in max.

It is generally discouraged to redefine built-ins as this makes code very hard to read.

Loading history...
Bug Best Practice introduced by
This seems to re-define the built-in min.

It is generally discouraged to redefine built-ins as this makes code very hard to read.

Loading history...
98
        magnitude = int(3 * log10(abs(max - min)) + 1)
99
        if magnitude % 3 == 0:
100
            first_place = 1
101
        elif magnitude % 3 == 1:
102
            first_place = 2
103
        else:
104
            first_place = 5
105
        magnitude = magnitude // 3 - 1
106
        step = first_place * pow(10, magnitude)
107
        first_val = ceil(min / step) * step
108
        return first_val, step
109
110
    def update_ticks(self):
111
        self._ticks = []
112
        major, medium, minor = self.tick_length
0 ignored issues
show
Unused Code introduced by
The variable minor seems to be unused.
Loading history...
Unused Code introduced by
The variable major seems to be unused.
Loading history...
113
        if self.labels is not None and not self.auto_scale:
114
            values = self.values or range(len(self.labels))
115
            for i, text in zip(values, self.labels):
116
                self._ticks.append((i, text, medium, 1))
117
        else:
118
            if self.scale and not self.auto_scale:
119
                min, max, step = self.scale
0 ignored issues
show
Bug Best Practice introduced by
This seems to re-define the built-in max.

It is generally discouraged to redefine built-ins as this makes code very hard to read.

Loading history...
Bug Best Practice introduced by
This seems to re-define the built-in min.

It is generally discouraged to redefine built-ins as this makes code very hard to read.

Loading history...
Bug Best Practice introduced by
It seems like you are trying to unpack a non-sequence, which was defined at line 62.
Loading history...
Bug Best Practice introduced by
It seems like you are trying to unpack a non-sequence, which was defined at line 71.
Loading history...
120
            elif self.auto_range:
121
                min, max = self.auto_range
0 ignored issues
show
Bug Best Practice introduced by
It seems like you are trying to unpack a non-sequence, which was defined at line 87.
Loading history...
122
                if min is not None and max is not None:
123
                    step = (max - min) / 10
124
                else:
125
                    return
126
            else:
127
                return
128
129
            if max == min:
130
                return
131
132
            val, step = self.compute_scale(min, max)
133
            while val <= max:
134
                self._ticks.append((val, "%.4g" % val, medium, step))
135
                val += step
136
137
    def update_graph(self):
138
        if self.update_callback:
139
            self.update_callback()
140
141
    def update(self, zoom_only=False):
142
        self.update_ticks()
143
        line_color = self.plot.color(OWPalette.Axis)
144
        text_color = self.plot.color(OWPalette.Text)
145
        if not self.graph_line or not self.scene():
146
            return
147
        self.line_item.setLine(self.graph_line)
148
        self.line_item.setPen(line_color)
149
        if self.title:
150
            self.title_item.setHtml('<b>' + self.title + '</b>')
151
            self.title_item.setDefaultTextColor(text_color)
152
        if self.title_location == AxisMiddle:
153
            title_p = 0.5
154
        elif self.title_location == AxisEnd:
155
            title_p = 0.95
156
        else:
157
            title_p = 0.05
158
        title_pos = self.graph_line.pointAt(title_p)
159
        v = self.graph_line.normalVector().unitVector()
160
161
        dense_text = False
162
        if hasattr(self, 'title_margin'):
163
            offset = self.title_margin
164
        elif self._ticks:
165
            if self.should_be_expanded():
166
                offset = 55
167
                dense_text = True
168
            else:
169
                offset = 35
170
        else:
171
            offset = 10
172
173
        if self.title_above:
174
            title_pos += (v.p2() - v.p1()) * (offset + QFontMetrics(self.title_item.font()).height())
175
        else:
176
            title_pos -= (v.p2() - v.p1()) * offset
177
            ## TODO: Move it according to self.label_pos
0 ignored issues
show
Coding Style introduced by
TODO and FIXME comments should generally be avoided.
Loading history...
178
        self.title_item.setVisible(self.show_title)
179
        self.title_item.setRotation(-self.graph_line.angle())
180
        c = self.title_item.mapToParent(self.title_item.boundingRect().center())
181
        tl = self.title_item.mapToParent(self.title_item.boundingRect().topLeft())
182
        self.title_item.setPos(title_pos - c + tl)
183
184
        ## Arrows
185
        if not zoom_only:
186
            if self.start_arrow_item:
187
                self.scene().removeItem(self.start_arrow_item)
188
                self.start_arrow_item = None
189
            if self.end_arrow_item:
190
                self.scene().removeItem(self.end_arrow_item)
191
                self.end_arrow_item = None
192
193
        if self.arrows & AxisStart:
194
            if not zoom_only or not self.start_arrow_item:
195
                self.start_arrow_item = QGraphicsPathItem(self.arrow_path, self)
196
            self.start_arrow_item.setPos(self.graph_line.p1())
197
            self.start_arrow_item.setRotation(-self.graph_line.angle() + 180)
198
            self.start_arrow_item.setBrush(line_color)
199
            self.start_arrow_item.setPen(line_color)
200
        if self.arrows & AxisEnd:
201
            if not zoom_only or not self.end_arrow_item:
202
                self.end_arrow_item = QGraphicsPathItem(self.arrow_path, self)
203
            self.end_arrow_item.setPos(self.graph_line.p2())
204
            self.end_arrow_item.setRotation(-self.graph_line.angle())
205
            self.end_arrow_item.setBrush(line_color)
206
            self.end_arrow_item.setPen(line_color)
207
208
        ## Labels
209
210
        n = len(self._ticks)
211
        resize_plot_item_list(self.label_items, n, QGraphicsTextItem, self)
212
        resize_plot_item_list(self.label_bg_items, n, QGraphicsRectItem, self)
213
        resize_plot_item_list(self.tick_items, n, QGraphicsLineItem, self)
214
215
        test_rect = QRectF(self.graph_line.p1(), self.graph_line.p2()).normalized()
216
        test_rect.adjust(-1, -1, 1, 1)
217
218
        n_v = self.graph_line.normalVector().unitVector()
219
        if self.title_above:
220
            n_p = n_v.p2() - n_v.p1()
221
        else:
222
            n_p = n_v.p1() - n_v.p2()
223
        l_v = self.graph_line.unitVector()
224
        l_p = l_v.p2() - l_v.p1()
225
        for i in range(n):
226
            pos, text, size, step = self._ticks[i]
227
            hs = 0.5 * step
228
            tick_pos = self.map_to_graph(pos)
229
            if not test_rect.contains(tick_pos):
230
                self.tick_items[i].setVisible(False)
231
                self.label_items[i].setVisible(False)
232
                continue
233
            item = self.label_items[i]
234
            item.setVisible(True)
235
            if not zoom_only:
236
                if self.id in XAxes or getattr(self, 'is_horizontal', False):
237
                    item.setHtml('<center>' + Qt.escape(text.strip()) + '</center>')
238
                else:
239
                    item.setHtml(Qt.escape(text.strip()))
240
241
            item.setTextWidth(-1)
242
            text_angle = 0
243
            if dense_text:
244
                w = min(item.boundingRect().width(), self.max_text_width)
245
                item.setTextWidth(w)
246
                if self.title_above:
247
                    label_pos = tick_pos + n_p * (w + self.text_margin) + l_p * item.boundingRect().height() / 2
248
                else:
249
                    label_pos = tick_pos + n_p * self.text_margin + l_p * item.boundingRect().height() / 2
250
                text_angle = -90 if self.title_above else 90
251
            else:
252
                w = min(item.boundingRect().width(),
253
                        QLineF(self.map_to_graph(pos - hs), self.map_to_graph(pos + hs)).length())
254
                label_pos = tick_pos + n_p * self.text_margin + l_p * item.boundingRect().height() / 2
255
                item.setTextWidth(w)
256
257
            if not self.always_horizontal_text:
258
                if self.title_above:
259
                    item.setRotation(-self.graph_line.angle() - text_angle)
260
                else:
261
                    item.setRotation(self.graph_line.angle() - text_angle)
262
263
            item.setPos(label_pos)
264
            item.setDefaultTextColor(text_color)
265
266
            self.label_bg_items[i].setRect(item.boundingRect())
267
            self.label_bg_items[i].setPen(QPen(Qt.NoPen))
268
            self.label_bg_items[i].setBrush(self.plot.color(OWPalette.Canvas))
269
270
            item = self.tick_items[i]
271
            item.setVisible(True)
272
            tick_line = QLineF(v)
273
            tick_line.translate(-tick_line.p1())
274
            tick_line.setLength(size)
275
            if self.title_above:
276
                tick_line.setAngle(tick_line.angle() + 180)
277
            item.setLine(tick_line)
278
            item.setPen(line_color)
279
            item.setPos(self.map_to_graph(pos))
280
281
    @staticmethod
282
    def make_title(label, unit=None):
283
        lab = '<i>' + label + '</i>'
284
        if unit:
285
            lab = lab + ' [' + unit + ']'
286
        return lab
287
288
    def set_line(self, line):
289
        self.graph_line = line
290
        self.update()
291
292
    def set_title(self, title):
293
        self.title = title
294
        self.update()
295
296
    def set_show_title(self, b):
297
        self.show_title = b
298
        self.update()
299
300
    def set_labels(self, labels, values):
301
        self.labels = labels
302
        self.values = values
303
        self.graph_line = None
304
        self.auto_scale = False
305
        self.update_ticks()
306
        self.update_graph()
307
308
    def set_scale(self, min, max, step_size):
0 ignored issues
show
Bug Best Practice introduced by
This seems to re-define the built-in max.

It is generally discouraged to redefine built-ins as this makes code very hard to read.

Loading history...
Bug Best Practice introduced by
This seems to re-define the built-in min.

It is generally discouraged to redefine built-ins as this makes code very hard to read.

Loading history...
309
        self.scale = (min, max, step_size)
310
        self.graph_line = None
311
        self.auto_scale = False
312
        self.update_ticks()
313
        self.update_graph()
314
315
    def set_tick_length(self, minor, medium, major):
316
        self.tick_length = (minor, medium, major)
317
        self.update()
318
319
    def map_to_graph(self, x):
320
        min, max = self.plot.bounds_for_axis(self.id)
0 ignored issues
show
Bug Best Practice introduced by
This seems to re-define the built-in max.

It is generally discouraged to redefine built-ins as this makes code very hard to read.

Loading history...
Bug Best Practice introduced by
This seems to re-define the built-in min.

It is generally discouraged to redefine built-ins as this makes code very hard to read.

Loading history...
321
        if min == max:
322
            return QPointF()
323
        line_point = self.graph_line.pointAt((x - min) / (max - min))
324
        end_point = line_point * self.zoom_transform
325
        return self.projection(end_point, self.graph_line)
326
327
    @staticmethod
328
    def projection(point, line):
329
        norm = line.normalVector()
330
        norm.translate(point - norm.p1())
331
        p = QPointF()
332
        type = line.intersect(norm, p)
0 ignored issues
show
Bug Best Practice introduced by
This seems to re-define the built-in type.

It is generally discouraged to redefine built-ins as this makes code very hard to read.

Loading history...
Unused Code introduced by
The variable type seems to be unused.
Loading history...
333
        return p
334
335
    def continuous_labels(self):
336
        min, max, step = self.scale
0 ignored issues
show
Bug Best Practice introduced by
This seems to re-define the built-in max.

It is generally discouraged to redefine built-ins as this makes code very hard to read.

Loading history...
Bug Best Practice introduced by
This seems to re-define the built-in min.

It is generally discouraged to redefine built-ins as this makes code very hard to read.

Loading history...
Bug Best Practice introduced by
It seems like you are trying to unpack a non-sequence, which was defined at line 62.
Loading history...
Bug Best Practice introduced by
It seems like you are trying to unpack a non-sequence, which was defined at line 71.
Loading history...
Unused Code introduced by
The variable step seems to be unused.
Loading history...
337
        magnitude = log10(abs(max - min))
0 ignored issues
show
Unused Code introduced by
The variable magnitude seems to be unused.
Loading history...
338
339
    def paint(self, painter, option, widget):
340
        pass
341
342
    def boundingRect(self):
0 ignored issues
show
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
343
        return QRectF()
344
345
    def ticks(self):
346
        if not self._ticks:
347
            self.update_ticks()
348
        return self._ticks
349
350
    def bounds(self):
351
        if self._bounds:
352
            return self._bounds
353
        if self.labels:
354
            return -0.2, len(self.labels) - 0.8
355
        elif self.scale:
356
            min, max, _step = self.scale
0 ignored issues
show
Bug Best Practice introduced by
This seems to re-define the built-in max.

It is generally discouraged to redefine built-ins as this makes code very hard to read.

Loading history...
Bug Best Practice introduced by
This seems to re-define the built-in min.

It is generally discouraged to redefine built-ins as this makes code very hard to read.

Loading history...
Bug Best Practice introduced by
It seems like you are trying to unpack a non-sequence, which was defined at line 62.
Loading history...
Bug Best Practice introduced by
It seems like you are trying to unpack a non-sequence, which was defined at line 71.
Loading history...
357
            return min, max
358
        elif self.auto_range:
359
            return self.auto_range
360
        else:
361
            return 0, 1
362
363
    def set_bounds(self, value):
364
        self._bounds = value
365
366
    def should_be_expanded(self):
367
        self.update_ticks()
368
        return self.id in YAxes or self.always_horizontal_text or sum(
369
            len(t[1]) for t in self._ticks) * 12 > self.plot.width()
370
371