bokeh: [BUG] Behaviour of automated padding for ranges is inconsistent

Exists in Bokeh from 0.13.0 till 1.4.0 Tested on Windows 10 and Ubunto 16.0, on Firefox and Chrome (most recent versions).

That’s the weird bug, so explanation will be rather long.

Example 1:

from bokeh.plotting import figure, output_file, show

x = [0.1, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0]
y1 = [30 for xx in x]

legend_items = []
p = figure(plot_width=500, plot_height=400)
l1 = p.line(x, y1, line_width=2, color='red')
p.y_range.start = 0
li1 = LegendItem(label='Line 1', renderers=[l1])
legend_items.append(li1)
legend = Legend(items=legend_items, location=(0, -30))
legend.click_policy = "hide"
p.add_layout(legend, 'left')

show(p)

That produces pretty looking chart: image

Automatic padding added a little bit of space between horizontal line and top end of the chart, so line is clearly visible.

Example 2:

from bokeh.plotting import figure, output_file, show

x = [0.1, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0]
y1 = [300 for xx in x]

legend_items = []
p = figure(plot_width=500, plot_height=400)
l1 = p.line(x, y1, line_width=2, color='red')
p.y_range.start = 0
li1 = LegendItem(label='Line 1', renderers=[l1])
legend_items.append(li1)
legend = Legend(items=legend_items, location=(0, -30))
legend.click_policy = "hide"
p.add_layout(legend, 'left')

show(p)

image

With line located at Y=300, there’s no automatic padding added, so line located directly on the border of the chart.

One can argue, it can be easily fixed bu using customized y_range, but manually setting y_range bounds makes it hard to use new feature from 1.4.0 (https://github.com/bokeh/bokeh/issues/9144):

Example 3 (only works in Bokeh 1.4.0):

from bokeh.plotting import figure, output_file, show

x = [0.1, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0]
y1 = [30 for xx in x]
y2 = [60 for xx in x]
y3 = [90 for xx in x]

legend_items = []

# create a new plot with a log axis type
p = figure(plot_width=500, plot_height=400)

l1 = p.line(x, y1, line_width=2, color='red')
l2 = p.line(x, y2, line_width=2, color='blue')
l3 = p.line(x, y3, line_width=2, color='green')

p.y_range.start = 0

li1 = LegendItem(label='Line 1', renderers=[l1])
li2 = LegendItem(label='Line 2', renderers=[l2])
li3 = LegendItem(label='Line 3', renderers=[l3])
legend_items.append(li1)
legend_items.append(li2)
legend_items.append(li3)

p.y_range.only_visible = True

legend = Legend(items=legend_items, location=(0, -30))
legend.click_policy = "hide"
p.add_layout(legend, 'left')

show(p)

Now we are using automated Y-range scaling. All lines are clearly visible no matter how many lines we have hidden:

image

or

image

But if we change Y-values for lines back to 300…

Example 4 (only works in Bokeh 1.4.0):

from bokeh.plotting import figure, output_file, show

x = [0.1, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0]
y1 = [300 for xx in x]
y2 = [600 for xx in x]
y3 = [900 for xx in x]

legend_items = []

# create a new plot with a log axis type
p = figure(plot_width=500, plot_height=400)

l1 = p.line(x, y1, line_width=2, color='red')
l2 = p.line(x, y2, line_width=2, color='blue')
l3 = p.line(x, y3, line_width=2, color='green')

p.y_range.start = 0

li1 = LegendItem(label='Line 1', renderers=[l1])
li2 = LegendItem(label='Line 2', renderers=[l2])
li3 = LegendItem(label='Line 3', renderers=[l3])
legend_items.append(li1)
legend_items.append(li2)
legend_items.append(li3)

p.y_range.only_visible = True

legend = Legend(items=legend_items, location=(0, -30))
legend.click_policy = "hide"
p.add_layout(legend, 'left')

show(p)

For 3 lines it works fine:

image

For 2 lines it works fine:

image

But with only 1 line visible automated padding not working again:

image

What I would expect?

I would expect to see similar gap between red line and top boundary of the chart, as I see for blue and green lines.

Why it’s important?

Without callbacks there’s no way to change y_range for the chart when certain lines became hidden and visible. As far as I understand, #9144 was supposed to provide simple way to do so, but since automated padding not always working the way you expect it to work, it’s almost useless.

About this issue

  • Original URL
  • State: closed
  • Created 4 years ago
  • Comments: 24 (24 by maintainers)

Commits related to this issue

Most upvoted comments

@Tikonderoga yes exactly PRs from forks are the standard way to proceed