internlm/SWE-Fixer-Train-110K huggingface dataset:
Repository: bokeh/bokeh

Issue:
extra_x_ranges should allow Range not only Range1d
bokeh 0.1.1

While `extra_y_ranges` allows Categorical or Linear axis, `extra_x_ranges` only allows for `Range1d`:

``` python
from bokeh.models import FactorRange
from bokeh.plotting import figure, show

plot = figure()
plot.extra_x_ranges['x2'] = FactorRange('foo', 'bar')
plot.extra_y_ranges['y2'] = FactorRange('bar', 'baz')
show(plot)
```

Acceptance criteria:
- Fix the issue
- Add unit tests

extra_x_ranges should allow Range not only Range1d
bokeh 0.1.1

While `extra_y_ranges` allows Categorical or Linear axis, `extra_x_ranges` only allows for `Range1d`:

``` python
from bokeh.models import FactorRange
from bokeh.plotting import figure, show

plot = figure()
plot.extra_x_ranges['x2'] = FactorRange('foo', 'bar')
plot.extra_y_ranges['y2'] = FactorRange('bar', 'baz')
show(plot)
```

Acceptance criteria:
- Fix the issue
- Add unit tests



Discussion:

Resolving patch:
diff --git a/bokeh/models/plots.py b/bokeh/models/plots.py
--- a/bokeh/models/plots.py
+++ b/bokeh/models/plots.py
@@ -362,7 +362,7 @@ def _check_colon_in_category_label(self):
     "seconds since epoch" instead of formatted dates
     """)
 
-    extra_x_ranges = Dict(String, Instance(Range1d), help="""
+    extra_x_ranges = Dict(String, Instance(Range), help="""
     Additional named ranges to make available for mapping x-coordinates.
 
     This is useful for adding additional axes.


Test patch:
diff --git a/bokeh/models/tests/test_plots.py b/bokeh/models/tests/test_plots.py
--- a/bokeh/models/tests/test_plots.py
+++ b/bokeh/models/tests/test_plots.py
@@ -13,7 +13,7 @@
 import pytest
 
 from bokeh.plotting import figure
-from bokeh.models import GlyphRenderer, Label, Range1d
+from bokeh.models import GlyphRenderer, Label, Range1d, FactorRange, Plot
 from bokeh.models.tools import PanTool
 
 
@@ -86,5 +86,41 @@ def test_responsive_property_is_false_by_default():
     assert plot.responsive is False
 
 
+class BaseTwinAxis(object):
+    """Base class for testing extra ranges"""
+
+    def verify_axis(self, axis_name):
+        plot = Plot()  # no need for setUp()
+        range_obj = getattr(plot, 'extra_{}_ranges'.format(axis_name))
+        range_obj['foo_range'] = self.get_range_instance()
+        self.assertTrue(range_obj['foo_range'])
+
+    def test_x_range(self):
+        self.verify_axis('x')
+
+    def test_y_range(self):
+        self.verify_axis('y')
+
+    @staticmethod
+    def get_range_instance():
+        raise NotImplementedError
+
+
+class TestCategoricalTwinAxis(BaseTwinAxis, unittest.TestCase):
+    """Test whether extra x and y ranges can be categorical"""
+
+    @staticmethod
+    def get_range_instance():
+        return FactorRange('foo', 'bar')
+
+
+class TestLinearTwinAxis(BaseTwinAxis, unittest.TestCase):
+    """Test whether extra x and y ranges can be Range1d"""
+
+    @staticmethod
+    def get_range_instance():
+        return Range1d(0, 42)
+
+
 if __name__ == '__main__':
     unittest.main()
Repository: bokeh/bokeh

Issue:
Notebook rendering is broken
It appears #4189 broke notebook rendering. Perhaps this is because the DOM is already loaded? I was not aware that notebook `show` currently went though the `autoload_js` template. A fix might be to split off the `onload` part into a wrapper that is only applied selectively. 



Discussion:
@bryevdv Would it be better/easier to just have an extra argument for autoload_static() like:

autoload_static(..., onload=False)   # Which would be default and not add the event listener

and autoload_static(..., onload=True)  # Which would add an event listener to the JS

This way it doesn't break backwards compatibility and makes the onload it explicit

@seanlaw that might be a reasonable and quick fix! I do want to take this issue as an opportunity to do a little investigation and poking, I think our notebook loading is not as bulletproof as it once was so I would like to evaluate it top-to-bottom, and try to make it as simple and streamlined as possible. 


Resolving patch:
diff --git a/bokeh/embed.py b/bokeh/embed.py
--- a/bokeh/embed.py
+++ b/bokeh/embed.py
@@ -34,6 +34,11 @@ def _wrap_in_function(code):
     code = "\n".join(["    " + line for line in code.split("\n")])
     return 'Bokeh.$(function() {\n%s\n});' % code
 
+def _wrap_in_onload(code):
+    # indent and wrap Bokeh function def around
+    code = "\n".join(["    " + line for line in code.split("\n")])
+    return 'document.addEventListener("DOMContentLoaded", function(event) {\n%s\n});' % code
+
 def components(models, resources=None, wrap_script=True, wrap_plot_info=True):
     '''
     Return HTML components to embed a Bokeh plot. The data for the plot is
@@ -341,13 +346,13 @@ def autoload_static(model, resources, script_path):
     script = _script_for_render_items(docs_json, render_items, wrap_script=False)
     item = render_items[0]
 
-    js = AUTOLOAD_JS.render(
+    js = _wrap_in_onload(AUTOLOAD_JS.render(
         js_urls = resources.js_files,
         css_urls = resources.css_files,
         js_raw = resources.js_raw + [script],
         css_raw = resources.css_raw_str,
         elementid = item['elementid'],
-    )
+    ))
 
     tag = AUTOLOAD_TAG.render(
         src_path = script_path,


Test patch:
Repository: bokeh/bokeh

Issue:
There should be an actual click tool
Currently we have tap tool which acts as a hybrid of select and inspect tool. It modifies selection on associated data sources and executes a callback. I would like to have a tool (or a mode) where I could execute a callback only. One option is to add (e.g.) `ClickTool` or add `select = Bool(True)` to `TapTool`. Perhaps we can get both sides by in one change by adding the later and making `click` tool alias to set `select=False`.



Discussion:

Resolving patch:
diff --git a/bokeh/models/tools.py b/bokeh/models/tools.py
--- a/bokeh/models/tools.py
+++ b/bokeh/models/tools.py
@@ -181,6 +181,14 @@ class TapTool(Tool):
     defaults to all renderers on a plot.
     """)
 
+    behavior = Enum("select", "inspect", defult="select", help="""
+    This tool can be configured to either make selections or inspections
+    on associated data sources. The difference is that selection changes
+    propagate across bokeh and other components (e.g. selection glyph)
+    will be notified. Inspecions don't act like this, so it's useful to
+    configure `callback` when setting `behavior='inspect'`.
+    """)
+
     callback = Instance(Callback, help="""
     A client-side action specification, like opening a URL, showing
     a dialog box, etc. See :class:`~bokeh.models.actions.Action` for details.
diff --git a/bokeh/plotting/helpers.py b/bokeh/plotting/helpers.py
--- a/bokeh/plotting/helpers.py
+++ b/bokeh/plotting/helpers.py
@@ -205,7 +205,7 @@ def _get_num_minor_ticks(axis_class, num_minor_ticks):
     "ywheel_zoom": lambda: WheelZoomTool(dimensions=["height"]),
     "save": lambda: PreviewSaveTool(),
     "resize": lambda: ResizeTool(),
-    "click": "tap",
+    "click": lambda: TapTool(behavior="inspect"),
     "tap": lambda: TapTool(),
     "crosshair": lambda: CrosshairTool(),
     "box_select": lambda: BoxSelectTool(),


Test patch:
diff --git a/bokehjs/test/test_common/test_selection_manager.coffee b/bokehjs/test/test_common/test_selection_manager.coffee
--- a/bokehjs/test/test_common/test_selection_manager.coffee
+++ b/bokehjs/test/test_common/test_selection_manager.coffee
@@ -77,9 +77,6 @@ describe "SelectionManager", ->
 
   sm = new SelectionManager()
 
-  it "should have a reference to an empty selection", ->
-    expect(sm.empty).to.deep.equal empty_selection
-
   it "should start with no selectors", ->
     expect(sm.selectors).to.deep.equal {}
Repository: bokeh/bokeh

Issue:
simple_hdf5 example needs to use the full path to the data file



Discussion:

Resolving patch:
diff --git a/examples/app/simple_hdf5/main.py b/examples/app/simple_hdf5/main.py
--- a/examples/app/simple_hdf5/main.py
+++ b/examples/app/simple_hdf5/main.py
@@ -1,3 +1,5 @@
+from os.path import dirname, join
+
 import numpy as np
 import h5py
 
@@ -26,7 +28,7 @@ def get_data(f, name):
 
 def select_data():
     data_val = data_select.value
-    with h5py.File('demo_data.hdf5', 'r') as f:
+    with h5py.File(join(dirname(__file__), 'demo_data.hdf5'), 'r') as f:
         return get_data(f, data_val)
 
 


Test patch:
Repository: bokeh/bokeh

Issue:
Chord Diagram only has one color when using Python 2.7
Running the chord example produces the following output when using Python 2.7:

![image](https://cloud.githubusercontent.com/assets/4241244/15794033/9c896878-299c-11e6-8fb3-aa5b36950f7f.png)

The bug is caused during the generation of colors in chord builder by the difference in integer division between Python 2 and Python 3. 



Discussion:
@birdsarah suggested I also link the screenshot from a recent build of master. 
https://s3.amazonaws.com/bokeh-travis/134917699/examples.html#charts/file/chord_from_df


Resolving patch:
diff --git a/bokeh/charts/builders/chord_builder.py b/bokeh/charts/builders/chord_builder.py
--- a/bokeh/charts/builders/chord_builder.py
+++ b/bokeh/charts/builders/chord_builder.py
@@ -16,7 +16,7 @@
 # -----------------------------------------------------------------------------
 # Imports
 # -----------------------------------------------------------------------------
-from __future__ import absolute_import
+from __future__ import absolute_import, division
 
 import numpy as np
 import pandas as pd


Test patch:
diff --git a/bokeh/charts/builders/tests/test_chord_builder.py b/bokeh/charts/builders/tests/test_chord_builder.py
new file mode 100644
--- /dev/null
+++ b/bokeh/charts/builders/tests/test_chord_builder.py
@@ -0,0 +1,20 @@
+""" This is the Bokeh charts testing interface for the Chord Diagram
+
+"""
+
+#-----------------------------------------------------------------------------
+# Imports
+#-----------------------------------------------------------------------------
+from __future__ import absolute_import
+
+from bokeh.charts.builders.chord_builder import ChordBuilder
+
+#-----------------------------------------------------------------------------
+# Classes and functions
+#-----------------------------------------------------------------------------
+
+def test_colors(test_data):
+    builder = ChordBuilder(test_data.pd_data, origin='col1', destination='col2')
+    builder.create()
+    colors = builder.connection_data.data['colors']
+    assert colors[0] != colors[1]
Repository: bokeh/bokeh

Issue:
Can't serialize timedelta column
If you have a data frame with a column of timedeltas, then make a ColumnDataSource out of it, the ColumnDataSource will be created:

``` python
In [9]: source.data['delta']
Out[9]:
[Timedelta('0 days 00:33:00'),
 Timedelta('0 days 00:35:00'),
 Timedelta('0 days 03:01:00')]
```

But if you use that source in a plot, even if you don't use the column, when it comes time to serialize (show/save/embed etc) the plot, it fails:

``` python
Timedelta('0 days 00:33:00') is not JSON serializable
```

Maybe we can provide some validation on ColumnDataSource creation? Or, at least provide a more helpful message on failure, as it's not immediately obvious what went wrong.



Discussion:

Resolving patch:
diff --git a/bokeh/core/json_encoder.py b/bokeh/core/json_encoder.py
--- a/bokeh/core/json_encoder.py
+++ b/bokeh/core/json_encoder.py
@@ -42,6 +42,10 @@ def transform_python_types(self, obj):
         # datetime is a subclass of date.
         elif isinstance(obj, dt.datetime):
             return time.mktime(obj.timetuple()) * 1000. + obj.microsecond / 1000.
+        # Timedelta
+        # timedelta is class in the datetime library
+        elif isinstance(obj, dt.timedelta):
+            return dict(days=obj.days, seconds=obj.seconds, microseconds=obj.microseconds)
         # Date
         elif isinstance(obj, dt.date):
             return time.mktime(obj.timetuple()) * 1000.


Test patch:
diff --git a/bokeh/core/tests/test_json_encoder.py b/bokeh/core/tests/test_json_encoder.py
--- a/bokeh/core/tests/test_json_encoder.py
+++ b/bokeh/core/tests/test_json_encoder.py
@@ -53,7 +53,6 @@ def test_pd_timestamp(self):
         ts = pd.tslib.Timestamp('April 28, 1948')
         self.assertEqual(self.encoder.default(ts), -684115200000)
 
-
 class TestSerializeJson(unittest.TestCase):
 
     def setUp(self):
@@ -129,5 +128,17 @@ def test_builtin_datetime_types(self):
                     u'b': [time.mktime(b.timetuple())*1000],
         }
         assert deserialized == baseline
+
+    def test_builtin_timedelta_types(self):
+        """ should convert time delta to a dictionary
+        """
+        delta = dt.timedelta(days=42, seconds=1138, microseconds=1337)
+        serialized = self.serialize(delta)
+        deserialized = self.deserialize(serialized)
+        baseline = {u"days": 42,
+                    u"seconds": 1138,
+                    u"microseconds": 1337}
+        assert deserialized == baseline
+
 if __name__ == "__main__":
     unittest.main()
Repository: bokeh/bokeh

Issue:
restore pandas_dataframe test
Was temporarily removed in #4193, should be restored when the root cause can be addressed. 



Discussion:
The test never actually got removed, but seems to have been failing much less frequently, consider making this issue for removing the non-functional line in `examples.yaml`


Resolving patch:
diff --git a/examples/compat/pandas_dataframe.py b/examples/compat/pandas_dataframe.py
--- a/examples/compat/pandas_dataframe.py
+++ b/examples/compat/pandas_dataframe.py
@@ -4,12 +4,11 @@
 from bokeh import mpl
 from bokeh.plotting import output_file, show
 
-ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
-ts = ts.cumsum()
+index=pd.date_range('1/1/2000', periods=1000)
 
-df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=list('ABCD'))
-df = df.cumsum()
-df.plot(legend=False)
+df = pd.DataFrame(np.random.randn(1000, 4), index=index, columns=list('ABCD'))
+
+df.cumsum().plot(legend=False)
 
 output_file("pandas_dataframe.html", title="pandas_dataframe.py example")
 


Test patch:
diff --git a/tests/examples/examples.yaml b/tests/examples/examples.yaml
--- a/tests/examples/examples.yaml
+++ b/tests/examples/examples.yaml
@@ -1,7 +1,6 @@
 - path: "models"
   skip: ["choropleth.py", "maps_cities.py", "data_tables_server.py"]
 - path: "compat"
-  skip: ["pandas_dataframe"]
 - path: "charts/file"
   type: file
 - path: "howto/charts"
Repository: bokeh/bokeh

Issue:
Unnecessary ANSI escapes are generated by setup on Windows
Sample output:

```
>python setup.py build

Bokeh includes a JavaScript library (BokehJS) that has its own
build process. How would you like to handle BokehJS:

1) build and install fresh BokehJS
2) install last built BokehJS from bokeh/bokehjs/build

Choice? 1
Building BokehJS... [1m[32mSuccess![0m[0m

Build output:

   [2m[32m[19:48:57][0m[0m [2mUsing gulpfile ~\code\test\src\bokeh\bokehjs\gulpfile.js[0m
   [2m[32m[19:48:57][0m[0m [2mStarting 'typings:install'...[0m
   [2m[32m[19:48:58][0m[0m [2mFinished 'typings:install' after 1.61 s[0m
   [2m[32m[19:48:58][0m[0m [2mStarting 'build'...[0m
   [2m[32m[19:48:58][0m[0m [2mStarting 'scripts'...[0m
   [2m[32m[19:48:58][0m[0m [2mStarting 'scripts:coffee'...[0m
   [2m[32m[19:48:58][0m[0m [2mStarting 'scripts:eco'...[0m
   [2m[32m[19:48:58][0m[0m [2mStarting 'scripts:ts'...[0m
   [2m[32m[19:48:58][0m[0m [2mStarting 'styles'...[0m
   [2m[32m[19:48:58][0m[0m [2mStarting 'styles:build'...[0m
   [2m[32m[19:49:01][0m[0m [2mFinished 'scripts:eco' after 2.53 s[0m
   [2m[32m[19:49:04][0m[0m [2mFinished 'scripts:ts' after 6.08 s[0m
   [2m[32m[19:49:08][0m[0m [2mFinished 'styles:build' after 9.35 s[0m
   [2m[32m[19:49:08][0m[0m [2mStarting 'styles:minify'...[0m
   [2m[32m[19:49:08][0m[0m [2mFinished 'styles:minify' after 393 ms[0m
   [2m[32m[19:49:08][0m[0m [2mFinished 'styles' after 9.74 s[0m
   [2m[32m[19:49:14][0m[0m [2mFinished 'scripts:coffee' after 16 s[0m
   [2m[32m[19:49:14][0m[0m [2mStarting 'scripts:compile'...[0m
   [2m[32m[19:49:14][0m[0m [2mFinished 'scripts:compile' after 3.82 s[0m
   [2m[32m[19:49:14][0m[0m [2mStarting 'scripts:build'...[0m
   [2m[32m[19:49:23][0m[0m [2mFinished 'scripts:build' after 9.01 s[0m
   [2m[32m[19:49:23][0m[0m [2mStarting 'scripts:minify'...[0m
   [2m[32m[19:49:59][0m[0m [2mFinished 'scripts:minify' after 35 s[0m
   [2m[32m[19:49:59][0m[0m [2mFinished 'scripts' after 1 min[0m
   [2m[32m[19:49:59][0m[0m [2mFinished 'build' after 1 min[0m
```

Perhaps colorama should not be imported on Windows?



Discussion:
Conditional import seems reasonable. Would you be interested in submitting the small PR for it?

np

Thanks!


Resolving patch:
diff --git a/setup.py b/setup.py
--- a/setup.py
+++ b/setup.py
@@ -36,6 +36,7 @@ def blue(text): return "%s%s%s" % (colorama.Fore.BLUE, text, colorama.Style.RESE
     def red(text): return "%s%s%s" % (colorama.Fore.RED, text, colorama.Style.RESET_ALL)
     def green(text): return "%s%s%s" % (colorama.Fore.GREEN, text, colorama.Style.RESET_ALL)
     def yellow(text): return "%s%s%s" % (colorama.Fore.YELLOW, text, colorama.Style.RESET_ALL)
+    sys.platform == "win32" and colorama.init()
 except ImportError:
     def bright(text): return text
     def dim(text): return text


Test patch:
Repository: bokeh/bokeh

Issue:
Jitter import missing, affecting PR #4490
In PR #4490, running _examples/plotting/file/jitter.py_ gives this error:

```
File "jitter.py", line 3, in <module>
    from bokeh.models import ColumnDataSource, Jitter
ImportError: cannot import name 'Jitter'
```



Discussion:

Resolving patch:
diff --git a/bokeh/models/__init__.py b/bokeh/models/__init__.py
--- a/bokeh/models/__init__.py
+++ b/bokeh/models/__init__.py
@@ -21,6 +21,7 @@
 from .tickers import *
 from .tiles import *
 from .tools import *
+from .transforms import *
 
 ### Deprecation note:
 ### bokeh.models.widgets.layouts was deprecated in 0.11.1 in favor of


Test patch:
Repository: bokeh/bokeh

Issue:
Undeprecate VBox and HBox
I would like names `VBox` and `HBox` to stay, because they are more meaningful to from UI point of view than the new counterparts.



Discussion:
Additionally, `Column` could be confusing with data column. This is similar issue, yet not that significant, as with canvas.

Ping @pzwang

`Row` and `Column` are meaningful to me (coming from a web-development background where the common paradigm in web-page layout is rows & columns).

BUT I can totally appreciate that `VBox` and `HBox` are more meaningful to others, and I think we have a very diverse user base.

So, I'm +1 on un-deprecating `VBox`, `HBox`. 

But just to be clear, I would also:
- keep `Row` and `Column`
- keep the deprecation of the `vplot`, `hplot` and other old layout functions.

One outstanding question: `Row` and `Column` are going to get matching layout functions `row` and `column` - which will have the function of making sure everything inside them has the same layout mode, and can also handle other conveniences (like allowing `responsive=True/False` as well as `sizing_mode='...'`). Should we also make matching `vbox`, `hbox` layout functions? (My vote would be yes - to keep everything consistent).


Resolving patch:
diff --git a/bokeh/models/layouts.py b/bokeh/models/layouts.py
--- a/bokeh/models/layouts.py
+++ b/bokeh/models/layouts.py
@@ -202,23 +202,33 @@ class Column(Box):
     """
 
 
-# ---- DEPRECATIONS
-
-@deprecated("Bokeh 0.12.0", "bokeh.layouts.gridplot")
-def GridPlot(*args, **kwargs):
-    from bokeh.layouts import gridplot
-    return gridplot(*args, **kwargs)
+def HBox(*args, **kwargs):
+    """ Lay out child components in a single horizontal row.
 
+    Children can be specified as positional arguments, as a single argument
+    that is a sequence, or using the ``children`` keyword argument.
 
-@deprecated("Bokeh 0.12.0", "bokeh.models.layouts.Row")
-def HBox(*args, **kwargs):
+    Returns a Row instance.
+    """
     return Row(*args, **kwargs)
 
 
-@deprecated("Bokeh 0.12.0", "bokeh.models.layouts.Column")
 def VBox(*args, **kwargs):
+    """ Lay out child components in a single vertical row.
+
+    Children can be specified as positional arguments, as a single argument
+    that is a sequence, or using the ``children`` keyword argument.
+
+    Returns a Column instance.
+    """
     return Column(*args, **kwargs)
 
+# ---- DEPRECATIONS
+
+@deprecated("Bokeh 0.12.0", "bokeh.layouts.gridplot")
+def GridPlot(*args, **kwargs):
+    from bokeh.layouts import gridplot
+    return gridplot(*args, **kwargs)
 
 @deprecated("Bokeh 0.12.0", "bokeh.models.layouts.WidgetBox")
 def VBoxForm(*args, **kwargs):


Test patch:
Repository: bokeh/bokeh

Issue:
clustering app example needs updates for recent changes
Fails because `theme.yaml` tries to set `title_text_font_size` on `Plot` This bypasses the (python) property that deprecates this former `Plot` property, and tries to set a (Bokeh) property with that name directly on the plot. This fails, because of the work to make `Title` its own model.

Will fix up the `theme.yaml` and note this problem in migration guide. Since we barely demonstrated and not discussed the theming, hopefully this will not bite many people at all. 



Discussion:

Resolving patch:
diff --git a/examples/app/clustering/main.py b/examples/app/clustering/main.py
--- a/examples/app/clustering/main.py
+++ b/examples/app/clustering/main.py
@@ -153,7 +153,7 @@ def update_algorithm_or_clusters(attrname, old, new):
     source.data['x'] = X[:, 0]
     source.data['y'] = X[:, 1]
 
-    plot.title = algorithm
+    plot.title.text = algorithm
 
 def update_samples_or_dataset(attrname, old, new):
     global X, y


Test patch:
Repository: bokeh/bokeh

Issue:
Layouts got slightly broken during sizing_mode change
The default became sizing_mode='fixed' everywhere, which left dashboard looking much less awesome.

A bug was introduced into bokeh.layouts.py



Discussion:

Resolving patch:
diff --git a/bokeh/layouts.py b/bokeh/layouts.py
--- a/bokeh/layouts.py
+++ b/bokeh/layouts.py
@@ -193,9 +193,9 @@ def layout(children=None, sizing_mode='fixed', responsive=None, *args):
 
     # Make the grid
     rows = []
-    for row in children:
+    for r in children:
         row_children = []
-        for item in row:
+        for item in r:
             if isinstance(item, LayoutDOM):
                 item.sizing_mode = sizing_mode
                 row_children.append(item)
@@ -204,7 +204,7 @@ def layout(children=None, sizing_mode='fixed', responsive=None, *args):
                     """Only LayoutDOM items can be inserted into a layout.
                     Tried to insert: %s of type %s""" % (item, type(item))
                 )
-        rows.append(row(children=row, sizing_mode=sizing_mode))
+        rows.append(row(children=row_children, sizing_mode=sizing_mode))
     grid = column(children=rows, sizing_mode=sizing_mode)
     return grid
 
diff --git a/examples/howto/layouts/dashboard.py b/examples/howto/layouts/dashboard.py
--- a/examples/howto/layouts/dashboard.py
+++ b/examples/howto/layouts/dashboard.py
@@ -91,6 +91,6 @@ def linked_panning():
     bollinger(),
     slider(),
     linked_panning(),
-])
+], sizing_mode='stretch_both')
 
 show(l)


Test patch: