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

Issue:
$ can get overridden in the Notebook 
It is (evidently) possible for other libraries to override `$`, and then our use of `$(function() ...)` as `js_wrapper` here:

https://github.com/bokeh/bokeh/blob/master/bokeh/resources.py#L248

is fragile, and can cause problems, specifically plots not reloading. This was reported here:

https://groups.google.com/a/continuum.io/forum/#!topic/bokeh/7CJxL7cKxXs

@mattpap just changing to `Bokeh.$` seems to work fine. Do you have any other input?



Discussion:
Take a look at (http://api.jquery.com/jquery.noconflict/) .  If jQuery is called via a require call, you should be able to get the exact version of jquery that you expect, without conflict from the global jQuery object.
(http://nfriedly.com/stuff/jquery-requirejs-noconflict-issue/example.html)

It looks like you want to call `jQuery.noConflict(true)`.  This will restore the original version of the global window.$ function to the original jQuery version.  It is my understanding that `jQuery.noConflict()` simply restores the original library only if it is a different library such as prototype.js.  but `jQuery.noConflict()` will still result in the original window.$ pointing to a different version of jQuery.  

This seems to be the relevant file.
(https://github.com/bokeh/bokeh/blob/d88ce391bccfa424fd52f4e485be1f2ae7ea093c/bokehjs/src/coffee/main.coffee)

@mattpap I am going to make a PR that just makes the `$` -> `Bokeh.$` sub, if there is more or different actions to take please add your thoughts. 

That should be sufficient. As I said in yesterday's meeting, the only global variable that bokeh touches is `Bokeh`.


Resolving patch:
diff --git a/bokeh/resources.py b/bokeh/resources.py
--- a/bokeh/resources.py
+++ b/bokeh/resources.py
@@ -245,7 +245,7 @@ def js_wrapper(self):
         def pad(text, n=4):
             return "\n".join([ " "*n + line for line in text.split("\n") ])
 
-        wrapper = lambda code: '$(function() {\n%s\n});' % pad(code)
+        wrapper = lambda code: 'Bokeh.$(function() {\n%s\n});' % pad(code)
 
         if self.dev:
             js_wrapper = lambda code: 'require(["jquery", "main"], function($, Bokeh) {\nBokeh.set_log_level("%s");\n%s\n});' % (self.log_level, pad(wrapper(code)))


Test patch:
diff --git a/bokeh/tests/test_resources.py b/bokeh/tests/test_resources.py
--- a/bokeh/tests/test_resources.py
+++ b/bokeh/tests/test_resources.py
@@ -5,13 +5,13 @@
 import bokeh
 import bokeh.resources as resources
 
-WRAPPER = """$(function() {
+WRAPPER = """Bokeh.$(function() {
     foo
 });"""
 
 WRAPPER_DEV = '''require(["jquery", "main"], function($, Bokeh) {
 Bokeh.set_log_level("info");
-    $(function() {
+    Bokeh.$(function() {
         foo
     });
 });'''
Repository: bokeh/bokeh

Issue:
Charts behaviour when notebook=True and server arguments are specified
Right now this makes the browser one a new tab pointing to the bokeh-server url that is hosting the plot and creates a new iPyNB cell output. IMO it makes sense to just generate the output cell..



Discussion:
Will be closing this one later today. If any @bokeh/dev have different opinions about this please let me know.

I agree with your opinion...


Resolving patch:
diff --git a/bokeh/charts/_charts.py b/bokeh/charts/_charts.py
--- a/bokeh/charts/_charts.py
+++ b/bokeh/charts/_charts.py
@@ -475,7 +475,8 @@ def show(self):
         if self.server:
             self.session.store_document(self.doc)
             link = self.session.object_link(self.doc.context)
-            view(link)
+            if not self.notebook:
+                view(link)
 
         if self.notebook:
             from bokeh.embed import notebook_div


Test patch:
Repository: bokeh/bokeh

Issue:
mpl.to_bokeh() should use the same tools found in bokeh.plotting.figure
bokeh.plotting.figure creates a toolbar with these default tools: pan, box zoom, resize, wheel zoom, preview/save, resets, and help.

Please use the same default tools with to_bokeh()



Discussion:
It is a sensible request...

Absolutely, although the best thing going forward is for `.to_bokeh()` to return a `Plot` that can be used with `save` or `show` or `push` just like anything else. Then the plot can be tinkered with however a user likes before displaying it. 

Yes, taking care of that in #1554 


Resolving patch:
diff --git a/bokeh/mpl.py b/bokeh/mpl.py
--- a/bokeh/mpl.py
+++ b/bokeh/mpl.py
@@ -19,8 +19,8 @@
 import numpy as np
 import pandas as pd
 
-from .models.glyphs import (Asterisk, Circle, Cross, Diamond, InvertedTriangle, Line,
-                            MultiLine, Patches, Square, Text, Triangle, X)
+from .models.glyphs import (Asterisk, Circle, Cross, Diamond, InvertedTriangle,
+                            Line, MultiLine, Patches, Square, Text, Triangle, X)
 from .mplexporter.exporter import Exporter
 from .mplexporter.renderers import Renderer
 from .mpl_helpers import (convert_dashes, delete_last_col, get_props_cycled,
@@ -28,7 +28,9 @@
 from .models import (ColumnDataSource, DataRange1d, DatetimeAxis, GlyphRenderer,
                      Grid, GridPlot, LinearAxis, PanTool, Plot, PreviewSaveTool,
                      ResetTool, WheelZoomTool)
-from .plotting import (curdoc, output_file, output_notebook, output_server)
+from .plotting import (curdoc, output_file, output_notebook, output_server,
+                       DEFAULT_TOOLS)
+from .plotting_helpers import _process_tools_arg
 
 #-----------------------------------------------------------------------------
 # Classes and functions
@@ -59,11 +61,8 @@ def open_figure(self, fig, props):
     def close_figure(self, fig):
         "Complete the plot: add tools."
         # Add tools
-        pan = PanTool()
-        wheelzoom = WheelZoomTool()
-        reset = ResetTool()
-        previewsave = PreviewSaveTool()
-        self.plot.add_tools(pan, wheelzoom, reset, previewsave)
+        tool_objs = _process_tools_arg(self.plot, DEFAULT_TOOLS)
+        self.plot.add_tools(*tool_objs)
 
         # Simple or Grid plot setup
         if len(fig.axes) <= 1:
@@ -82,11 +81,8 @@ def close_figure(self, fig):
                              plot_height=self.height)
                 _plot.title = ""
                 # and add new tools
-                _pan = PanTool()
-                _wheelzoom = WheelZoomTool()
-                _reset = ResetTool()
-                _previewsave = PreviewSaveTool()
-                _plot.add_tools(_pan, _wheelzoom, _reset, _previewsave)
+                _tool_objs = _process_tools_arg(_plot, DEFAULT_TOOLS)
+                _plot.add_tools(*_tool_objs)
                 # clean the plot ref from axis and grids
                 _plot_rends = subrends[i]
                 for r in _plot_rends:


Test patch:
Repository: bokeh/bokeh

Issue:
Pan/Zoom being allowed on categorical charts
running on ea9b34761e4190f6906872745eb2d9f3302c7477

affects `boxplot.py` and `heatmap.py`, at least. 



Discussion:

Resolving patch:
diff --git a/bokeh/charts/_chartobject.py b/bokeh/charts/_chartobject.py
--- a/bokeh/charts/_chartobject.py
+++ b/bokeh/charts/_chartobject.py
@@ -476,8 +476,6 @@ def _prepare_show(self):
 
         # we create the chart object
         self.create_chart()
-        # we start the plot (adds axis, grids and tools)
-        self.start_plot()
         # we prepare values
         self.prepare_values()
         # we get the data from the incoming input
@@ -486,6 +484,8 @@ def _prepare_show(self):
         self.get_source()
         # we dynamically inject the source and ranges into the plot
         self.add_data_plot()
+        # we start the plot (adds axis, grids and tools)
+        self.start_plot()
         # we add the glyphs into the plot
         self.draw()
         # we pass info to build the legend


Test patch:
Repository: bokeh/bokeh

Issue:
Slider should accept Float stepwise
Reference: https://groups.google.com/a/continuum.io/d/msgid/bokeh/057af2c7-4c97-4a04-a898-fa41e68652ce%40continuum.io?utm_medium=email&utm_source=footer



Discussion:

Resolving patch:
diff --git a/bokeh/models/widgets/inputs.py b/bokeh/models/widgets/inputs.py
--- a/bokeh/models/widgets/inputs.py
+++ b/bokeh/models/widgets/inputs.py
@@ -69,7 +69,7 @@ class Slider(InputWidget):
     value = Float()
     start = Float()
     end = Float()
-    step = Int()
+    step = Float()
     orientation = Enum("horizontal", "vertical")
 
 class DateRangeSlider(InputWidget):
diff --git a/examples/app/sliders_applet/sliders_app.py b/examples/app/sliders_applet/sliders_app.py
--- a/examples/app/sliders_applet/sliders_app.py
+++ b/examples/app/sliders_applet/sliders_app.py
@@ -47,7 +47,7 @@ def create(cls):
 
         obj.offset = Slider(
             title="offset", name='offset',
-            value=0.0, start=-5.0, end=5.0
+            value=0.0, start=-5.0, end=5.0, step=0.1
         )
         obj.amplitude = Slider(
             title="amplitude", name='amplitude',


Test patch:
Repository: bokeh/bokeh

Issue:
write script to integrate all bokeh.models and their JSON into dev docs
This is to support #1579 



Discussion:

Resolving patch:
diff --git a/sphinx/json_ref.py b/sphinx/json_ref.py
new file mode 100644
--- /dev/null
+++ b/sphinx/json_ref.py
@@ -0,0 +1,82 @@
+from __future__ import print_function
+
+import importlib
+import json
+
+import jinja2
+
+from bokeh.plot_object import PlotObject, Viewable
+from bokeh.protocol import serialize_json
+
+ITEM = jinja2.Template("""
+.. code-block:: javascript
+
+    {{ model_json|indent(4) }}
+""")
+
+
+module_names = [
+    'bokeh.models.axes',
+    'bokeh.models.formatters',
+    'bokeh.models.glyphs',
+    'bokeh.models.grids',
+    'bokeh.models.map_plots',
+    'bokeh.models.mappers',
+    'bokeh.models.markers',
+    'bokeh.models.plots',
+    'bokeh.models.ranges',
+    'bokeh.models.renderers',
+    'bokeh.models.sources',
+    'bokeh.models.tickers',
+    'bokeh.models.tools',
+    'bokeh.models.widget',
+]
+
+print("""
+
+.. contents::
+    :local:
+    :depth: 2
+
+Models
+------
+""")
+
+for module_name in module_names:
+    module = importlib.import_module(module_name)
+
+    models = [x for x in vars(module).values() if type(x)==Viewable and x.__module__==module_name]
+    models.sort(key=lambda x:x.__name__)
+
+    print(".. _%s:" % module_name.replace('.', "_dot_"))
+    print()
+
+    header = "``%s``" % module_name
+    print(header)
+    print('-' * len(header))
+
+    for m in models:
+
+        model_json = json.dumps(
+            json.loads(serialize_json(m().dump(changed_only=False))),
+            sort_keys=True,
+            indent=2,
+            separators=(',', ': ')
+        )
+
+        print(
+"""
+.. autoclass:: %s.%s
+    :members:
+""" % (module_name, m.__name__))
+
+        text = ITEM.render(
+            model_json=model_json,
+        )
+
+
+
+        print(text)
+
+    print()
+


Test patch:
Repository: bokeh/bokeh

Issue:
In the timeseries tutorial, formatting the X-axis as dates
Pull requests with the fixes suggested in #1728. In the timeseries tutorial:
- Displaying the X-axis values as dates (not the numerical representation of the date)
- Customizing the format of the dates
- Naming the axis



Discussion:

Resolving patch:
diff --git a/sphinx/source/tutorial/exercises/stocks.py b/sphinx/source/tutorial/exercises/stocks.py
--- a/sphinx/source/tutorial/exercises/stocks.py
+++ b/sphinx/source/tutorial/exercises/stocks.py
@@ -21,7 +21,13 @@
 output_file("stocks.html", title="stocks.py example")
 
 # create a figure
-p1 = figure(title="Stocks")
+p1 = figure(title="Stocks",
+            x_axis_label="Date",
+            y_axis_label="Close price",
+            x_axis_type="datetime")
+p1.below[0].formatter.formats = dict(years=['%Y'],
+                                     months=['%b %Y'],
+                                     days=['%d %b %Y'])
 
 # EXERCISE: finish this line plot, and add more for the other stocks. Each one should
 # have a legend, and its own color.
diff --git a/sphinx/source/tutorial/solutions/stocks.py b/sphinx/source/tutorial/solutions/stocks.py
--- a/sphinx/source/tutorial/solutions/stocks.py
+++ b/sphinx/source/tutorial/solutions/stocks.py
@@ -21,7 +21,13 @@
 output_file("stocks.html", title="stocks.py example")
 
 # create a figure
-p1 = figure(title="Stocks")
+p1 = figure(title="Stocks",
+            x_axis_label="Date",
+            y_axis_label="Close price",
+            x_axis_type="datetime")
+p1.below[0].formatter.formats = dict(years=['%Y'],
+                                     months=['%b %Y'],
+                                     days=['%d %b %Y'])
 
 # EXERCISE: finish this line plot, and add more for the other stocks. Each one should
 # have a legend, and its own color.
@@ -39,7 +45,13 @@
 p1.grid.grid_line_alpha=0.3
 
 # EXERCISE: start a new figure
-p2 = figure(title="AAPL average")
+p2 = figure(title="AAPL average",
+            x_axis_label="Date",
+            y_axis_label="Close price",
+            x_axis_type="datetime")
+p2.below[0].formatter.formats = dict(years=['%Y'],
+                                     months=['%b %Y'],
+                                     days=['%d %b %Y'])
 
 # Here is some code to compute the 30-day moving average for AAPL
 aapl = AAPL['Adj Close']


Test patch:
Repository: bokeh/bokeh

Issue:
May need to dilate canvas 1px
with a zero size border, but also an outline, the outline is cropped off on right and bottom:
![screen shot 2013-11-16 at 10 20 00 am](https://f.cloud.github.com/assets/1078448/1556562/6f799d74-4edb-11e3-8f2a-3fcd8c317b2f.png)



Discussion:
This is still an issue as of 0.5.2:

![download](https://cloud.githubusercontent.com/assets/4944634/4065556/e24cdb2a-2e1b-11e4-9b4a-10f773a99963.png)

Gist [here](https://gist.github.com/kdodia/6053d8d42762af776dff).


Resolving patch:
diff --git a/examples/plotting/file/burtin.py b/examples/plotting/file/burtin.py
--- a/examples/plotting/file/burtin.py
+++ b/examples/plotting/file/burtin.py
@@ -67,7 +67,7 @@ def rad(mic):
 p = figure(plot_width=width, plot_height=height, title="",
     x_axis_type=None, y_axis_type=None,
     x_range=[-420, 420], y_range=[-420, 420],
-    min_border=0, outline_line_color=None,
+    min_border=0, outline_line_color="black",
     background_fill="#f0e1d2", border_fill="#f0e1d2")
 
 p.line(x+1, y+1, alpha=0)
diff --git a/examples/plotting/server/burtin.py b/examples/plotting/server/burtin.py
--- a/examples/plotting/server/burtin.py
+++ b/examples/plotting/server/burtin.py
@@ -70,7 +70,7 @@ def rad(mic):
 p = figure(plot_width=width, plot_height=height, title="",
     x_axis_type=None, y_axis_type=None,
     x_range=[-420, 420], y_range=[-420, 420],
-    min_border=0, outline_line_color=None,
+    min_border=0, outline_line_color="black",
     background_fill="#f0e1d2", border_fill="#f0e1d2")
 
 p.line(x+1, y+1, alpha=0)


Test patch:
Repository: bokeh/bokeh

Issue:
bokeh.plotting.patches line_dash argument only takes a list
The `bokeh.plotting.patches` renderer requires the argument to `line_dash` to be a list, it should probably take list and tuple

bokeh.plotting.patches line_dash argument only takes a list
The `bokeh.plotting.patches` renderer requires the argument to `line_dash` to be a list, it should probably take list and tuple



Discussion:
This is a trivial change of `List(int)` to `Seq(int)` in the `properties.DashPattern` initializer. 

This is a trivial change of `List(int)` to `Seq(int)` in the `properties.DashPattern` initializer. 


Resolving patch:
diff --git a/bokeh/properties.py b/bokeh/properties.py
--- a/bokeh/properties.py
+++ b/bokeh/properties.py
@@ -1091,7 +1091,7 @@ class DashPattern(Either):
     }
 
     def __init__(self, default=[], help=None):
-        types = Enum(enums.DashPattern), Regex(r"^(\d+(\s+\d+)*)?$"), List(Int)
+        types = Enum(enums.DashPattern), Regex(r"^(\d+(\s+\d+)*)?$"), Seq(Int)
         super(DashPattern, self).__init__(*types, default=default, help=help)
 
     def transform(self, value):


Test patch:
diff --git a/bokeh/tests/test_properties.py b/bokeh/tests/test_properties.py
--- a/bokeh/tests/test_properties.py
+++ b/bokeh/tests/test_properties.py
@@ -330,6 +330,25 @@ class Foo(HasProps):
         with self.assertRaises(ValueError):
             f.pat = [2, "a"]
 
+    def test_list(self):
+        class Foo(HasProps):
+            pat = DashPattern
+        f = Foo()
+
+        f.pat = ()
+        self.assertEqual(f.pat, ())
+        f.pat = (2,)
+        self.assertEqual(f.pat, (2,))
+        f.pat = (2, 4)
+        self.assertEqual(f.pat, (2, 4))
+        f.pat = (2, 4, 6)
+        self.assertEqual(f.pat, (2, 4, 6))
+
+        with self.assertRaises(ValueError):
+            f.pat = (2, 4.2)
+        with self.assertRaises(ValueError):
+            f.pat = (2, "a")
+
     def test_invalid(self):
         class Foo(HasProps):
             pat = DashPattern
@@ -764,7 +783,7 @@ def test_DashPattern(self):
         self.assertFalse(prop.is_valid(1.0))
         self.assertFalse(prop.is_valid(1.0+1.0j))
         self.assertTrue(prop.is_valid(""))
-        self.assertFalse(prop.is_valid(()))
+        self.assertTrue(prop.is_valid(()))
         self.assertTrue(prop.is_valid([]))
         self.assertFalse(prop.is_valid({}))
         self.assertFalse(prop.is_valid(Foo()))
Repository: bokeh/bokeh

Issue:
plotting.gridplot setting id from name
Here: https://github.com/bokeh/bokeh/blob/master/bokeh/plotting.py#L827

should not do this per recent discussions. 



Discussion:

Resolving patch:
diff --git a/bokeh/plotting.py b/bokeh/plotting.py
--- a/bokeh/plotting.py
+++ b/bokeh/plotting.py
@@ -597,12 +597,11 @@ def _push_or_save():
     if _default_file and _default_file['autosave']:
         save()
 
-def gridplot(plot_arrangement, name=None, **kwargs):
+def gridplot(plot_arrangement, **kwargs):
     """ Generate a plot that arranges several subplots into a grid.
 
     Args:
         plot_arrangement (nested list of Plots) : plots to arrange in a grid
-        name (str) : name for this plot
         **kwargs: additional attributes to pass in to GridPlot() constructor
 
     .. note:: `plot_arrangement` can be nested, e.g [[p1, p2], [p3, p4]]
@@ -611,8 +610,6 @@ def gridplot(plot_arrangement, name=None, **kwargs):
         grid_plot: a new :class:`GridPlot <bokeh.models.plots.GridPlot>`
     """
     grid = GridPlot(children=plot_arrangement, **kwargs)
-    if name:
-        grid._id = name
     subplots = itertools.chain.from_iterable(plot_arrangement)
     _deduplicate_plots(grid, subplots)
     _push_or_save()


Test patch:
Repository: bokeh/bokeh

Issue:
Allow grids to shade alternating bands



Discussion:

Resolving patch:
diff --git a/bokeh/models/grids.py b/bokeh/models/grids.py
--- a/bokeh/models/grids.py
+++ b/bokeh/models/grids.py
@@ -4,7 +4,7 @@
 from __future__ import absolute_import
 
 from ..properties import Int, String, Float, Auto, Instance, Tuple, Either, Include
-from ..mixins import LineProps
+from ..mixins import FillProps, LineProps
 
 from .renderers import GuideRenderer
 from .tickers import Ticker
@@ -48,3 +48,8 @@ class Grid(GuideRenderer):
     grid_props = Include(LineProps, help="""
     The %s of the Grid lines.
     """)
+
+    band_props = Include(FillProps, help="""
+    The %s of alternating bands between Grid lines.
+    """)
+
diff --git a/examples/plotting/file/stocks.py b/examples/plotting/file/stocks.py
--- a/examples/plotting/file/stocks.py
+++ b/examples/plotting/file/stocks.py
@@ -27,12 +27,14 @@
 
 p2 = figure(x_axis_type="datetime")
 
-p2.circle(aapl_dates, aapl, size=4, color='#A6CEE3', legend='close')
-p2.line(aapl_dates, aapl_avg, color='red', legend='avg')
+p2.circle(aapl_dates, aapl, size=4, color='darkgrey', alpha=0.2, legend='close')
+p2.line(aapl_dates, aapl_avg, color='navy', legend='avg')
 
 p2.title = "AAPL One-Month Average"
-p2.grid.grid_line_alpha=0.3
+p2.grid.grid_line_alpha=0
 p2.xaxis.axis_label = 'Date'
 p2.yaxis.axis_label = 'Price'
+p2.ygrid.band_fill_color="olive"
+p2.ygrid.band_fill_alpha = 0.1
 
 show(VBox(p1,p2))  # open a browser
diff --git a/examples/plotting/server/stocks.py b/examples/plotting/server/stocks.py
--- a/examples/plotting/server/stocks.py
+++ b/examples/plotting/server/stocks.py
@@ -30,13 +30,15 @@
 
 p2 = figure(x_axis_type="datetime")
 
-p2.circle(aapl_dates, aapl, size=4, color='#A6CEE3', legend='close')
-p2.line(aapl_dates, aapl_avg, color='red', legend='avg')
+p2.circle(aapl_dates, aapl, size=4, color='darkgrey', alpha=0.2, legend='close')
+p2.line(aapl_dates, aapl_avg, color='navy', legend='avg')
 
 p2.title = "AAPL One-Month Average"
-p2.grid.grid_line_alpha=0.3
+p2.grid.grid_line_alpha=0
 p2.xaxis.axis_label = 'Date'
 p2.yaxis.axis_label = 'Price'
+p2.ygrid.band_fill_color="olive"
+p2.ygrid.band_fill_alpha = 0.1
 
 show(VBox(p1,p2))  # open a browser
 


Test patch:
Repository: bokeh/bokeh

Issue:
use_prefix for Include not functioning completely correctly 
Ref: https://github.com/bokeh/bokeh/pull/1774#issuecomment-72505809

ping @mattpap 



Discussion:
more details:

``````
"nonselection_glyph": {"id": "58b9cbd3-0c5e-45cb-a817-b0961a384d0a", "type": "Circle"}```
``````

But the alpha values are not getting set in the serialized versions:

```
{"id": "58b9cbd3-0c5e-45cb-a817-b0961a384d0a", "attributes": 
{"y": {"field": "y1", "units": "data"}, "x": {"field": "x", "units": "data"}, 
"id": "58b9cbd3-0c5e-45cb-a817-b0961a384d0a", "line_color": 
{"value": "#1f77b4"}, "fill_alpha": {"value": 1.0, "units": "data"}, 
"fill_color": {"value": "#1f77b4"}, "doc": "8bb4fe60-8c36-4d74-
b35f-f443254e647e", "line_alpha": {"value": 1.0, "units": "data"}, 
"tags": []}, "type": "Circle"}
```

This is form the static `linked_brushing.py` example.

wait sorry - is the title of this PR supposed to be use_prefix?

Yes

This is undoubtedly the problem:

https://github.com/bokeh/bokeh/blob/master/bokeh/_glyph_functions.py#L68

I will fix it in the morning. 

> https://github.com/bokeh/bokeh/blob/master/bokeh/_glyph_functions.py#L68

You can always use `hasattr()` (not that I encourage that).

I would prefer to go back to inheritance, and use something like this:

```
class Foo(Property, FillProps):
    _fill_doc_template = "foo bar %s baz"

```

but I am not sure offhand how to make that work cleanly.

Could make that work by importing mixins into properties and polluting `MetaHasProps` in ugly ways. I'll just make the `hasattr` fix for now with a note to improve. 


Resolving patch:
diff --git a/bokeh/_glyph_functions.py b/bokeh/_glyph_functions.py
--- a/bokeh/_glyph_functions.py
+++ b/bokeh/_glyph_functions.py
@@ -65,11 +65,12 @@ def func(plot, *args, **kwargs):
         nonselection_glyph_params = _materialize_colors_and_alpha(kwargs, prefix='nonselection_', default_alpha=0.1)
         nonselection_glyph = glyph.clone()
 
-        if isinstance(nonselection_glyph, FillProps):
+        # TODO: (bev) This is a bit hacky.
+        if hasattr(nonselection_glyph, 'fill_color'):
             nonselection_glyph.fill_color = nonselection_glyph_params['fill_color']
             nonselection_glyph.fill_alpha = nonselection_glyph_params['fill_alpha']
 
-        if isinstance(nonselection_glyph, LineProps):
+        if hasattr(nonselection_glyph, 'line_color'):
             nonselection_glyph.line_color = nonselection_glyph_params['line_color']
             nonselection_glyph.line_alpha = nonselection_glyph_params['line_alpha']
 


Test patch: