How color mapper works ?

Hi,

I tried to make a basic correlation matrix with a linear color bar on the side, and got a Value Error with the dictionnary mapping values to LinearColorMaper. I don’t understand why. Any body could light me up ?

from bokeh.plotting import figure, show, output_notebook

from bokeh.palettes import Viridis256

from bokeh.models import ColumnDataSource, ColorBar, LinearColorMapper

from bokeh.sampledata.autompg import autompg

corr = autompg.corr()

cols = list( corr.columns)

x = y = c =

for i in cols:

for j in cols:

x.append( j)

y.append( i)

c.append( abs( corr[ i][ j]))

mapper = LinearColorMapper( palette=Viridis256, low=0, high=1)

colors= { ‘field’: c, ‘transform’: mapper}

color_bar = ColorBar( color_mapper=mapper, location=( 0, 0))

p = figure( toolbar_location=None, tools=’’, x_range=cols, y_range=cols)

p.rect( x, y, fill_color=colors, line_color=‘black’, width=1, height=1)

p.add_layout( color_bar, ‘right’)

output_notebook()

show§

=> ValueError: expected an element of either … # on p.rect( …, color=colors, …

Thx

alEx

Hi,

  Try ColumnDataSource. Code below doesn't throw an error but the

plot is not showing anything. Perhaps this helps for the next
step.


      from bokeh.plotting import figure, show, output_notebook,
output_file
      from bokeh.palettes import Viridis256
      from bokeh.models import ColumnDataSource, ColorBar,
LinearColorMapper
      from bokeh.sampledata.autompg import autompg

      corr = autompg.corr()
      cols = list( corr.columns)

      x = y = c = []

      for i in cols:
          for j in cols:
              x.append( j)
              y.append( i)
              c.append( abs( corr[ i][ j]))

      mapper = LinearColorMapper( palette=Viridis256, low=0, high=1)
      colors= { 'field': c, 'transform': mapper}
      color_bar = ColorBar( color_mapper=mapper, location=( 0, 0))

      p = figure( toolbar_location=None, tools='', x_range=cols,
y_range=cols)
      source = ColumnDataSource(dict(x=x, y=y, color=c))
      p.rect( 'x', 'y', source=source, fill_color={'field': 'color',
'transform': mapper}, line_color='black', width=1, height=1)
      p = figure( toolbar_location=None, tools='', x_range=cols,
y_range=cols)
      p.add_layout( color_bar, 'right')

      #output_file(r'/tmp/test.html')
      output_notebook()

      show(p)

Have a nice day,

Raphael
···

On 2017-05-04 09:43, alEx S wrote:

Hi,

      I tried to make a basic correlation matrix with a linear

color bar on the side, and got a Value Error with the
dictionnary mapping values to LinearColorMaper. I don’t
understand why. Any body could light me up ?

from bokeh.plotting import figure, show, output_notebook

from bokeh.palettes import Viridis256

        from bokeh.models import ColumnDataSource, ColorBar,

LinearColorMapper

from bokeh.sampledata.autompg import autompg

corr = autompg.corr()

cols = list( corr.columns)

x = y = c =

for i in cols:

for j in cols:

x.append( j)

y.append( i)

c.append( abs( corr[ i][ j]))

        mapper = LinearColorMapper( palette=Viridis256, low=0,

high=1)

colors= { ‘field’: c, ‘transform’: mapper}

        color_bar = ColorBar( color_mapper=mapper, location=( 0,

0))

        p = figure( toolbar_location=None, tools='',

x_range=cols, y_range=cols)

        p.rect( x, y, fill_color=colors, line_color='black',

width=1, height=1)

p.add_layout( color_bar, ‘right’)

output_notebook()

show§

=> ValueError: expected an element of either … # on p.rect( …, color=colors, …

Thx

alEx

  You received this message because you are subscribed to the Google

Groups “Bokeh Discussion - Public” group.

  To unsubscribe from this group and stop receiving emails from it,

send an email to [email protected].

  To post to this group, send email to [email protected]

  To view this discussion on the web visit [https://groups.google.com/a/continuum.io/d/msgid/bokeh/f6da23bc-7dba-473f-929b-7486eef2aaa0%40continuum.io](https://groups.google.com/a/continuum.io/d/msgid/bokeh/f6da23bc-7dba-473f-929b-7486eef2aaa0%40continuum.io?utm_medium=email&utm_source=footer).

  For more options, visit [https://groups.google.com/a/continuum.io/d/optout](https://groups.google.com/a/continuum.io/d/optout).

Thx Raphael.

The thing is I’m new to python and I don’t know where to look for how mapper works. If I try to just map or apply the mapper to the correlation values I have: TypeError: ‘LinearColorMapper’ object is not callable

import pandas as pd

source = pd.DataFrame( dict(x=x, y=y, color=c))
source[ ‘color’].map( mapper)

source[ ‘color’].apply( lambda x: mapper( x))

I really don’t know what to do !

All the best

alEx

···

On Thu, May 4, 2017 at 10:18 AM Raphael Walker [email protected] wrote:

Hi,

  Try ColumnDataSource. Code below doesn't throw an error but the

plot is not showing anything. Perhaps this helps for the next
step.

  from bokeh.plotting import figure, show, output_notebook,

output_file

  from bokeh.palettes import Viridis256
  from bokeh.models import ColumnDataSource, ColorBar,

LinearColorMapper
from bokeh.sampledata.autompg import autompg

  corr = autompg.corr()
  cols = list( corr.columns)

  x = y = c = []

  for i in cols:
      for j in cols:
          x.append( j)
          y.append( i)
          c.append( abs( corr[ i][ j]))

  mapper = LinearColorMapper( palette=Viridis256, low=0, high=1)
  colors= { 'field': c, 'transform': mapper}
  color_bar = ColorBar( color_mapper=mapper, location=( 0, 0))

  p = figure( toolbar_location=None, tools='', x_range=cols,

y_range=cols)

source = ColumnDataSource(dict(x=x, y=y, color=c))
p.rect( ‘x’, ‘y’, source=source, fill_color={‘field’: ‘color’,
‘transform’: mapper}, line_color=‘black’, width=1, height=1)

  p = figure( toolbar_location=None, tools='', x_range=cols,

y_range=cols)

p.add_layout( color_bar, ‘right’)

  #output_file(r'/tmp/test.html')
  output_notebook()

  show(p)



    Have a nice day,



    Raphael

On 2017-05-04 09:43, alEx S wrote:

Hi,

      I tried to make a basic correlation matrix with a linear

color bar on the side, and got a Value Error with the
dictionnary mapping values to LinearColorMaper. I don’t
understand why. Any body could light me up ?

from bokeh.plotting import figure, show, output_notebook

from bokeh.palettes import Viridis256

        from bokeh.models import ColumnDataSource, ColorBar,

LinearColorMapper

from bokeh.sampledata.autompg import autompg

corr = autompg.corr()

cols = list( corr.columns)

x = y = c =

for i in cols:

for j in cols:

x.append( j)

y.append( i)

c.append( abs( corr[ i][ j]))

        mapper = LinearColorMapper( palette=Viridis256, low=0,

high=1)

colors= { ‘field’: c, ‘transform’: mapper}

        color_bar = ColorBar( color_mapper=mapper, location=( 0,

0))

        p = figure( toolbar_location=None, tools='',

x_range=cols, y_range=cols)

        p.rect( x, y, fill_color=colors, line_color='black',

width=1, height=1)

p.add_layout( color_bar, ‘right’)

output_notebook()

show§

=> ValueError: expected an element of either … # on p.rect( …, color=colors, …

Thx

alEx

  You received this message because you are subscribed to the Google

Groups “Bokeh Discussion - Public” group.

  To unsubscribe from this group and stop receiving emails from it,

send an email to [email protected].

  To post to this group, send email to [email protected]

  To view this discussion on the web visit [https://groups.google.com/a/continuum.io/d/msgid/bokeh/f6da23bc-7dba-473f-929b-7486eef2aaa0%40continuum.io](https://groups.google.com/a/continuum.io/d/msgid/bokeh/f6da23bc-7dba-473f-929b-7486eef2aaa0%40continuum.io?utm_medium=email&utm_source=footer).

  For more options, visit [https://groups.google.com/a/continuum.io/d/optout](https://groups.google.com/a/continuum.io/d/optout).

You received this message because you are subscribed to the Google Groups “Bokeh Discussion - Public” group.

To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].

To post to this group, send email to [email protected].

To view this discussion on the web visit https://groups.google.com/a/continuum.io/d/msgid/bokeh/7dd2e92b-1621-8f14-95b6-4042ec5e69f7%40busino.ch.

For more options, visit https://groups.google.com/a/continuum.io/d/optout.

Hi Alex,

Please provide complete/runnable example.

  I don't see how you initialize the `mapper` in the code

snippet!!!

Raphael

···

On 2017-05-04 10:48, Alex Schmitt
wrote:

Thx Raphael.

      The thing is I'm new to python and I don't know where to

look for how mapper works. If I try to just map or apply the
mapper to the correlation values I have: TypeError: ‘LinearColorMapper’ object is not callable

import pandas as pd

source = pd.DataFrame( dict(x=x, y=y, color=c))
source[ ‘color’].map( mapper)

source[ ‘color’].apply( lambda x: mapper( x))

I really don’t know what to do !

All the best

alEx

      On Thu, May 4, 2017 at 10:18 AM Raphael Walker

<[email protected] >
wrote:

Hi,

          Try ColumnDataSource. Code below doesn't throw an error

but the plot is not showing anything. Perhaps this helps
for the next step.

          from bokeh.plotting import figure, show, output_notebook,

output_file

          from bokeh.palettes import Viridis256
          from bokeh.models import ColumnDataSource, ColorBar,

LinearColorMapper
from bokeh.sampledata.autompg import autompg

          corr = autompg.corr()
          cols = list( corr.columns)

          x = y = c = []

          for i in cols:
              for j in cols:
                  x.append( j)
                  y.append( i)
                  c.append( abs( corr[ i][ j]))

          mapper = LinearColorMapper( palette=Viridis256, low=0,

high=1)
colors= { ‘field’: c, ‘transform’: mapper}
color_bar = ColorBar( color_mapper=mapper, location=( 0,
0))

          p = figure( toolbar_location=None, tools='', x_range=cols,

y_range=cols)

source = ColumnDataSource(dict(x=x, y=y, color=c))
p.rect( ‘x’, ‘y’, source=source, fill_color={‘field’:
‘color’, ‘transform’: mapper}, line_color=‘black’,
width=1, height=1)

          p = figure( toolbar_location=None, tools='', x_range=cols,

y_range=cols)

p.add_layout( color_bar, ‘right’)

          #output_file(r'/tmp/test.html')
          output_notebook()

          show(p)



            Have a nice day,



            Raphael
          On

2017-05-04 09:43, alEx S wrote:

Hi,

              I tried to make a basic correlation matrix with a

linear color bar on the side, and got a Value Error
with the dictionnary mapping values to
LinearColorMaper. I don’t understand why. Any body
could light me up ?

                from bokeh.plotting import figure, show,

output_notebook

from bokeh.palettes import Viridis256

                from bokeh.models import ColumnDataSource,

ColorBar, LinearColorMapper

from bokeh.sampledata.autompg import autompg

corr = autompg.corr()

cols = list( corr.columns)

x = y = c =

for i in cols:

for j in cols:

x.append( j)

y.append( i)

c.append( abs( corr[ i][ j]))

                mapper = LinearColorMapper( palette=Viridis256,

low=0, high=1)

colors= { ‘field’: c, ‘transform’: mapper}

                color_bar = ColorBar( color_mapper=mapper,

location=( 0, 0))

                p = figure( toolbar_location=None, tools='',

x_range=cols, y_range=cols)

                p.rect( x, y, fill_color=colors,

line_color=‘black’, width=1, height=1)

p.add_layout( color_bar, ‘right’)

output_notebook()

show§

=> ValueError: expected an element of either … # on p.rect( …, color=colors, …

Thx

alEx

          You received this message because you are subscribed to

the Google Groups “Bokeh Discussion - Public” group.

          To unsubscribe from this group and stop receiving emails

from it, send an email to [email protected].

          To post to this group, send email to [email protected]

          To view this discussion on the web visit [https://groups.google.com/a/continuum.io/d/msgid/bokeh/f6da23bc-7dba-473f-929b-7486eef2aaa0%40continuum.io](https://groups.google.com/a/continuum.io/d/msgid/bokeh/f6da23bc-7dba-473f-929b-7486eef2aaa0%40continuum.io?utm_medium=email&utm_source=footer).

          For more options, visit [https://groups.google.com/a/continuum.io/d/optout](https://groups.google.com/a/continuum.io/d/optout).

      You received this message because you are subscribed to the

Google Groups “Bokeh Discussion - Public” group.

      To unsubscribe from this group and stop receiving emails from

it, send an email to [email protected].

      To post to this group, send email to [email protected]

      To view this discussion on the web visit [https://groups.google.com/a/continuum.io/d/msgid/bokeh/7dd2e92b-1621-8f14-95b6-4042ec5e69f7%40busino.ch](https://groups.google.com/a/continuum.io/d/msgid/bokeh/7dd2e92b-1621-8f14-95b6-4042ec5e69f7%40busino.ch?utm_medium=email&utm_source=footer).

      For more options, visit [https://groups.google.com/a/continuum.io/d/optout](https://groups.google.com/a/continuum.io/d/optout).

  You received this message because you are subscribed to the Google

Groups “Bokeh Discussion - Public” group.

  To unsubscribe from this group and stop receiving emails from it,

send an email to [email protected].

  To post to this group, send email to [email protected]

  To view this discussion on the web visit [https://groups.google.com/a/continuum.io/d/msgid/bokeh/CAJjPzf_6PiV65zhK8uFgxPq%3DnZaQVanmBaR9-torQxrbU4koHw%40mail.gmail.com](https://groups.google.com/a/continuum.io/d/msgid/bokeh/CAJjPzf_6PiV65zhK8uFgxPq%3DnZaQVanmBaR9-torQxrbU4koHw%40mail.gmail.com?utm_medium=email&utm_source=footer).

  For more options, visit [https://groups.google.com/a/continuum.io/d/optout](https://groups.google.com/a/continuum.io/d/optout).

I think you should have a look at the working example:

Raphael

···

https://github.com/bokeh/bokeh/blob/master/examples/plotting/file/color_data_map.py
On 2017-05-04 10:50, Raphael Walker
wrote:

Hi Alex,

Please provide complete/runnable example.

    I don't see how you initialize the `mapper` in the code

snippet!!!

Raphael

  -- You received this message because you are subscribed to the Google

Groups “Bokeh Discussion - Public” group.
To unsubscribe from this group and stop receiving emails from it,
send an email to .
To post to this group, send email to .
To view this discussion on the web visit .
For more options, visit .

    On 2017-05-04 10:48, Alex Schmitt

wrote:

Thx Raphael.

        The thing is I'm new to python and I don't know where to

look for how mapper works. If I try to just map or apply the
mapper to the correlation values I have: TypeError: ‘LinearColorMapper’ object is not callable

import pandas as pd

source = pd.DataFrame( dict(x=x, y=y, color=c))
source[ ‘color’].map( mapper)

source[ ‘color’].apply( lambda x: mapper( x))

I really don’t know what to do !

All the best

alEx

        On Thu, May 4, 2017 at 10:18 AM Raphael Walker

<[email protected] >
wrote:

Hi,

            Try ColumnDataSource. Code below doesn't throw an error

but the plot is not showing anything. Perhaps this helps
for the next step.

            from bokeh.plotting import figure, show,

output_notebook, output_file

            from bokeh.palettes import Viridis256
            from bokeh.models import ColumnDataSource, ColorBar,

LinearColorMapper
from bokeh.sampledata.autompg import autompg

            corr = autompg.corr()
            cols = list( corr.columns)

            x = y = c = []

            for i in cols:
                for j in cols:
                    x.append( j)
                    y.append( i)
                    c.append( abs( corr[ i][ j]))

            mapper = LinearColorMapper( palette=Viridis256, low=0,

high=1)
colors= { ‘field’: c, ‘transform’: mapper}
color_bar = ColorBar( color_mapper=mapper, location=( 0,
0))

            p = figure( toolbar_location=None, tools='',

x_range=cols, y_range=cols)

source = ColumnDataSource(dict(x=x, y=y, color=c))
p.rect( ‘x’, ‘y’, source=source, fill_color={‘field’:
‘color’, ‘transform’: mapper}, line_color=‘black’,
width=1, height=1)

            p = figure( toolbar_location=None, tools='',

x_range=cols, y_range=cols)

p.add_layout( color_bar, ‘right’)

            #output_file(r'/tmp/test.html')
            output_notebook()

            show(p)



              Have a nice day,



              Raphael
            On

2017-05-04 09:43, alEx S wrote:

Hi,

                I tried to make a basic correlation matrix with a

linear color bar on the side, and got a Value Error
with the dictionnary mapping values to
LinearColorMaper. I don’t understand why. Any body
could light me up ?

                  from bokeh.plotting import figure, show,

output_notebook

from bokeh.palettes import Viridis256

                  from bokeh.models import ColumnDataSource,

ColorBar, LinearColorMapper

from bokeh.sampledata.autompg import autompg

corr = autompg.corr()

cols = list( corr.columns)

x = y = c =

for i in cols:

for j in cols:

x.append( j)

y.append( i)

c.append( abs( corr[ i][ j]))

                  mapper = LinearColorMapper( palette=Viridis256,

low=0, high=1)

colors= { ‘field’: c, ‘transform’: mapper}

                  color_bar = ColorBar( color_mapper=mapper,

location=( 0, 0))

                  p = figure( toolbar_location=None, tools='',

x_range=cols, y_range=cols)

                  p.rect( x, y, fill_color=colors,

line_color=‘black’, width=1, height=1)

p.add_layout( color_bar, ‘right’)

output_notebook()

show§

=> ValueError: expected an element of either … # on p.rect( …, color=colors, …

Thx

alEx

            You received this message because you are subscribed to

the Google Groups “Bokeh Discussion - Public” group.

            To unsubscribe from this group and stop receiving emails

from it, send an email to [email protected].

            To post to this group, send email to [email protected]

            To view this discussion on the web visit [https://groups.google.com/a/continuum.io/d/msgid/bokeh/f6da23bc-7dba-473f-929b-7486eef2aaa0%40continuum.io](https://groups.google.com/a/continuum.io/d/msgid/bokeh/f6da23bc-7dba-473f-929b-7486eef2aaa0%40continuum.io?utm_medium=email&utm_source=footer).

            For more options, visit [https://groups.google.com/a/continuum.io/d/optout](https://groups.google.com/a/continuum.io/d/optout).

        You received this message because you are subscribed to the

Google Groups “Bokeh Discussion - Public” group.

        To unsubscribe from this group and stop receiving emails

from it, send an email to [email protected].

        To post to this group, send email to [email protected]

        To view this discussion on the web visit [https://groups.google.com/a/continuum.io/d/msgid/bokeh/7dd2e92b-1621-8f14-95b6-4042ec5e69f7%40busino.ch](https://groups.google.com/a/continuum.io/d/msgid/bokeh/7dd2e92b-1621-8f14-95b6-4042ec5e69f7%40busino.ch?utm_medium=email&utm_source=footer).

        For more options, visit [https://groups.google.com/a/continuum.io/d/optout](https://groups.google.com/a/continuum.io/d/optout).

    You received this message because you are subscribed to the

Google Groups “Bokeh Discussion - Public” group.

    To unsubscribe from this group and stop receiving emails from

it, send an email to [email protected].

    To post to this group, send email to [email protected]

    To view this discussion on the web visit [https://groups.google.com/a/continuum.io/d/msgid/bokeh/CAJjPzf_6PiV65zhK8uFgxPq%3DnZaQVanmBaR9-torQxrbU4koHw%40mail.gmail.com](https://groups.google.com/a/continuum.io/d/msgid/bokeh/CAJjPzf_6PiV65zhK8uFgxPq%3DnZaQVanmBaR9-torQxrbU4koHw%40mail.gmail.com?utm_medium=email&utm_source=footer).

    For more options, visit [https://groups.google.com/a/continuum.io/d/optout](https://groups.google.com/a/continuum.io/d/optout).

[email protected]
[email protected]
https://groups.google.com/a/continuum.io/d/msgid/bokeh/3d1de085-c07c-7864-5bf6-400a3c62bc3f%40busino.ch
https://groups.google.com/a/continuum.io/d/optout

Hi alEx,

Is the following the sort of thing you’re after? I’m not sure if colour mappers work with rectangle glyphs in the way you’re trying, but they do work with images which is what I use for this kind of plot…

from bokeh.plotting import figure, show

from bokeh.palettes import Viridis256
from bokeh.models import ColorBar, LinearColorMapper
from bokeh.sampledata.autompg import autompg

corr = autompg.corr()
cols = list(corr.columns)

x = y =

for i in cols:
for j in cols:
x.append(j)
y.append(i)

c = abs(autompg.corr().values)

mapper = LinearColorMapper(palette=Viridis256, low=0, high=1)
color_bar = ColorBar(color_mapper=mapper, location=(0,0))

p = figure(toolbar_location=None, tools=’’, x_range=cols, y_range=cols)
p.image([c], x=.5, y=.5, dw=len(cols), dh=len(cols), color_mapper=mapper)
p.add_layout(color_bar, ‘right’)

show§

``

Thx for helping me out guys.
At the end what was not working is that I thought that x = ;y = ; c = was equivalent to x = y = c = :frowning:

Now it’s working nicely ! And below is the full code with the plot and the html file for Hover interactivity at the end:

import numpy as np

import pandas as pd

from bokeh.plotting import figure, show, output_notebook

from bokeh.palettes import Viridis256

from bokeh.models import ColumnDataSource, ColorBar, LinearColorMapper, HoverTool

from bokeh.sampledata.autompg import autompg

cols = list( autompg.corr().columns)

corr_matrix = np.asmatrix( autompg.corr())

N = len( cols)

x = ; y = ; c = ; c_abs =

minus = [ ‘-’] * N ** 2

size = [ ‘25pt’] * N ** 2

for i in range(N):

for j in range(N):

x.append( cols[ j])

y.append( cols[ i])

c.append( corr_matrix[ i, j])

c_abs.append( abs( corr_matrix[ i, j]))

data = pd.DataFrame({ ‘x’: x, ‘y’: y, ‘c’:c, ‘c_abs’: c_abs, ‘minus’: minus, ‘size’: size})

mapper = LinearColorMapper( palette=Viridis256[ :: -1], low=0, high=1)

colors= { ‘field’: ‘c_abs’, ‘transform’: mapper}

color_bar = ColorBar( color_mapper=mapper, location=( 0, 0))

p = figure( toolbar_location=‘above’, tools=‘hover’, x_range=cols, y_range=cols, title=“Auto MPG Correlations”)

source = ColumnDataSource( data)

p.rect( ‘x’, ‘y’, source= data, fill_color=colors, line_color=None, width=1, height=1)

add a plus or a minus to indicate positive or negative correlation - colors are absolute values

p.cross( ‘x’, ‘y’, source= data.query( “c > 0”), size=10, color=‘black’, line_width=2)

p.text( ‘x’, ‘y’, text=‘minus’, source= data.query( “c < 0”),

color=‘black’, text_font_size=‘size’, y_offset=16, x_offset=-5)

p.add_layout( color_bar, ‘right’)

p.select_one( HoverTool).tooltips = [( 'correlation: ', ‘@c’),]

output_notebook()

show( p)

AutoMPGHeatMap.png

Have a nice day,

alEx

AutoMPGHeatMap.html (282 KB)

···

On Thu, May 4, 2017 at 12:20 PM Marcus Donnelly [email protected] wrote:

Hi alEx,

Is the following the sort of thing you’re after? I’m not sure if colour mappers work with rectangle glyphs in the way you’re trying, but they do work with images which is what I use for this kind of plot…

from bokeh.plotting import figure, show

from bokeh.palettes import Viridis256
from bokeh.models import ColorBar, LinearColorMapper

``

from bokeh.sampledata.autompg import autompg

corr = autompg.corr()
cols = list(corr.columns)

``

x = y =

``

for i in cols:
for j in cols:
x.append(j)
y.append(i)

``

c = abs(autompg.corr().values)

mapper = LinearColorMapper(palette=Viridis256, low=0, high=1)
color_bar = ColorBar(color_mapper=mapper, location=(0,0))

p = figure(toolbar_location=None, tools=’’, x_range=cols, y_range=cols)
p.image([c], x=.5, y=.5, dw=len(cols), dh=len(cols), color_mapper=mapper)
p.add_layout(color_bar, ‘right’)

show

``

You received this message because you are subscribed to the Google Groups “Bokeh Discussion - Public” group.

To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].

To post to this group, send email to [email protected].

To view this discussion on the web visit https://groups.google.com/a/continuum.io/d/msgid/bokeh/0979b398-5274-4b71-b220-b8b35f72b94c%40continuum.io.

For more options, visit https://groups.google.com/a/continuum.io/d/optout.