Repository: bokeh/bokeh

Issue:
hover_color only works for the last GlyphRenderer
#### ALL software version info (bokeh, python, notebook, OS, browser, any other relevant packages)

Bokeh  0.12.13, Python 3.5, notebook 5.2.1, windows 10, Chrome

#### Complete, minimal, self-contained example code that reproduces the issue

```
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure
from bokeh.io import show, output_notebook
output_notebook()

source = ColumnDataSource(data=dict(x=[1, 2, 3], y0=[1, 2, 3], y1=[-1, -2, -3]))
fig = figure(tools="hover", plot_width=500, plot_height=300, title=None)
c1 = fig.circle('x', 'y0', size=10, hover_color="firebrick", source=source)
c2 = fig.circle('x', 'y1', size=10, hover_color="firebrick", source=source)
show(fig)
```

#### Screenshots or screencasts of the bug in action

when mouse is over c1:

![chrome_2018-01-11_12-53-43](https://user-images.githubusercontent.com/826871/34807937-b744168a-f6ce-11e7-9b9d-e0343c2752c6.png)

when mouse is over c2:

![chrome_2018-01-11_12-54-18](https://user-images.githubusercontent.com/826871/34807943-c0dfbdfc-f6ce-11e7-9967-614a60d192e6.png)



Discussion:

Resolving patch:
diff --git a/bokeh/models/sources.py b/bokeh/models/sources.py
--- a/bokeh/models/sources.py
+++ b/bokeh/models/sources.py
@@ -40,6 +40,10 @@ class ColumnarDataSource(DataSource):
     An instance of a SelectionPolicy that determines how selections are set.
     """)
 
+    inspection_policy = Instance(SelectionPolicy, default=lambda: UnionRenderers(), help="""
+    An instance of a SelectionPolicy that determines how inspections are set.
+    """)
+
 class ColumnDataSource(ColumnarDataSource):
     ''' Maps names of columns to sequences or arrays.
 


Test patch:
diff --git a/bokeh/tests/test_objects.py b/bokeh/tests/test_objects.py
--- a/bokeh/tests/test_objects.py
+++ b/bokeh/tests/test_objects.py
@@ -50,7 +50,7 @@ def large_plot(n):
             xaxis, yaxis,
             xgrid, ygrid,
             renderer, renderer.view, glyph,
-            source, source.selected, source.selection_policy,
+            source, source.selected, source.selection_policy, source.inspection_policy,
             plot, plot.x_scale, plot.y_scale, plot.toolbar, plot.title,
             box_zoom.overlay, box_select.overlay,
         ] + tickers + tools)
diff --git a/bokehjs/test/core/selection_manager.coffee b/bokehjs/test/core/selection_manager.coffee
--- a/bokehjs/test/core/selection_manager.coffee
+++ b/bokehjs/test/core/selection_manager.coffee
@@ -60,7 +60,7 @@ describe "SelectionManager", ->
       @glyph_stub.returns(create_hit_test_result_from_hits([[1, 2]]))
       source = @renderer_view.model.data_source
 
-      did_hit = source.selection_manager.inspect(@renderer_view, "geometry")
+      did_hit = source.selection_manager.inspect([@renderer_view], "geometry")
       expect(did_hit).to.be.true
       expect(source.inspected.indices).to.be.deep.equal([1])
 
@@ -70,6 +70,6 @@ describe "SelectionManager", ->
       source.inspected.indices = [0, 1]
       expect(source.inspected.is_empty()).to.be.false
 
-      did_hit = source.selection_manager.inspect(@renderer_view, "geometry")
+      did_hit = source.selection_manager.inspect([@renderer_view], "geometry")
       expect(did_hit).to.be.false
       expect(source.inspected.is_empty()).to.be.true