Legend outside the plot and widgetbox

Hi All,
Please see the screenshot attached, I would like to put the legend directly below the widgetbox (not shifted), but it looks like plot and its legend is the single object (with a rectangular borders) and the widgetbox will be always shifted. Is it possible to find the way to overcome this issue?

A piece of code which defines the plot:

p = figure(plot_height=768, plot_width=1024)

legend = Legend(items=sorted(labels_metric), location=(10, -350))

p.add_layout(legend, ‘left’)

controls = [metricGroup, metricName, curve_text, select_curve, rules_text, select_rule]

inputs = widgetbox(*controls, sizing_mode=‘fixed’)

l = layout([[inputs, p]], sizing_mode=‘fixed’)

session.show(l)

Thank you!

Hi,

Not directly. Legends must go on the same HTML canvas as a Plot. They are not separate DOM elements which is the reason for what you are seing. A possible workaround, although clunky, would be to create a second plot that is completely empty except for a Legend that you create by hand to put in it. That second plot could go underneath the widgetbox.

Thanks,

Bryan

···

On Mar 16, 2017, at 16:11, Boris Gribkov <[email protected]> wrote:

Hi All,
Please see the screenshot attached, I would like to put the legend directly below the widgetbox (not shifted), but it looks like plot and its legend is the single object (with a rectangular borders) and the widgetbox will be always shifted. Is it possible to find the way to overcome this issue?

A piece of code which defines the plot:

....
p = figure(plot_height=768, plot_width=1024)
....
legend = Legend(items=sorted(labels_metric), location=(10, -350))
p.add_layout(legend, 'left')
....
controls = [metricGroup, metricName, curve_text, select_curve, rules_text, select_rule]
inputs = widgetbox(*controls, sizing_mode='fixed')
l = layout([[inputs, p]], sizing_mode='fixed')
session.show(l)
    
Thank you!

--
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/118f754b-22c0-444d-a247-adcaba368af9%40continuum.io\.
For more options, visit https://groups.google.com/a/continuum.io/d/optout\.

Hi Bryan,

Thank for your message, I have tried to do this but it seems I did something wrong.

p = figure(plot_height=768, plot_width=1024)
p_legend = figure(plot_height=300, plot_width=300) # adding another plot

....

legend = Legend(items=sorted(labels_metric), location=(10, -350))
p_legend.add_layout(legend)


controls = [metricGroup, metricName, curve_text, select_curve, rules_text, select_rule]
inputs = widgetbox(*controls, sizing_mode=‘fixed’)
l = layout([[inputs, p, p_legend]], sizing_mode=‘fixed’)

session.show(l)


in this case I can see only widgetbox, no plot at all... will think about your advise! Thank you!

<details class='elided'>
<summary title='Show trimmed content'>&#183;&#183;&#183;</summary>

пятница, 17 марта 2017 г., 0:14:32 UTC+3 пользователь Bryan Van de ven написал:
> Hi,
> 
> 
> 
> Not directly. Legends must go on the same HTML canvas as a Plot. They are not separate DOM elements which is the reason for what you are seing. A possible workaround, although clunky, would be to create a second plot that is completely empty except for a Legend that you create by hand to put in it. That second plot could go underneath the widgetbox.
> 
> 
> 
> Thanks,
> 
> 
> 
> Bryan
> 
> 
> 
> 
> 
> > On Mar 16, 2017, at 16:11, Boris Gribkov <[email protected]> wrote:
> 
> >
> > Hi All,
> 
> > Please see the screenshot attached, I would like to put the legend directly below the widgetbox (not shifted), but it looks like plot and its legend is the single object (with a rectangular borders) and the widgetbox will be always shifted. Is it possible to find the way to overcome this issue?
> >
> > A piece of code which defines the plot:
> 
> >
> > ....
> 
> > p = figure(plot_height=768, plot_width=1024)
> 
> > ....
> 
> > legend = Legend(items=sorted(labels_metric), location=(10, -350))
> 
> > p.add_layout(legend, 'left')
> 
> > ....
> 
> > controls = [metricGroup, metricName, curve_text, select_curve, rules_text, select_rule]
> 
> > inputs = widgetbox(*controls, sizing_mode='fixed')
> 
> > l = layout([[inputs, p]], sizing_mode='fixed')
> 
> > session.show(l)
> 
> >    
> > Thank you!
> 
> >
> >
> >
> >
> > --
> > 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/118f754b-22c0-444d-a247-adcaba368af9%40continuum.io](https://groups.google.com/a/continuum.io/d/msgid/bokeh/118f754b-22c0-444d-a247-adcaba368af9%40continuum.io).
> 
> > For more options, visit [https://groups.google.com/a/continuum.io/d/optout](https://groups.google.com/a/continuum.io/d/optout).
> 
> 
>

</details>

Hi,

Nothing jumps out at me, so I'd need a complete minimal example code that I could actually run in order to investigate further.

Thanks,

Bryan

···

On Mar 16, 2017, at 16:33, Boris Gribkov <[email protected]> wrote:

Hi Bryan,

Thank for your message, I have tried to do this but it seems I did something wrong.

p = figure(plot_height=768, plot_width=1024)
p_legend = figure(plot_height=300, plot_width=300) # adding another plot
....
legend = Legend(items=sorted(labels_metric), location=(10, -350))
p_legend.add_layout(legend)

controls = [metricGroup, metricName, curve_text, select_curve, rules_text, select_rule]
inputs = widgetbox(*controls, sizing_mode='fixed')
l = layout([[inputs, p, p_legend]], sizing_mode='fixed')

session.show(l)

in this case I can see only widgetbox, no plot at all... will think about your advise! Thank you!

пятница, 17 марта 2017 г., 0:14:32 UTC+3 пользователь Bryan Van de ven написал:
Hi,

Not directly. Legends must go on the same HTML canvas as a Plot. They are not separate DOM elements which is the reason for what you are seing. A possible workaround, although clunky, would be to create a second plot that is completely empty except for a Legend that you create by hand to put in it. That second plot could go underneath the widgetbox.

Thanks,

Bryan

> On Mar 16, 2017, at 16:11, Boris Gribkov <[email protected]> wrote:
>
> Hi All,
> Please see the screenshot attached, I would like to put the legend directly below the widgetbox (not shifted), but it looks like plot and its legend is the single object (with a rectangular borders) and the widgetbox will be always shifted. Is it possible to find the way to overcome this issue?
>
> A piece of code which defines the plot:
>
> ....
> p = figure(plot_height=768, plot_width=1024)
> ....
> legend = Legend(items=sorted(labels_metric), location=(10, -350))
> p.add_layout(legend, 'left')
> ....
> controls = [metricGroup, metricName, curve_text, select_curve, rules_text, select_rule]
> inputs = widgetbox(*controls, sizing_mode='fixed')
> l = layout([[inputs, p]], sizing_mode='fixed')
> session.show(l)
>
> Thank you!
>
>
>
>
> --
> 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 bokeh+un...@continuum.io.
> To post to this group, send email to bo...@continuum.io.
> To view this discussion on the web visit https://groups.google.com/a/continuum.io/d/msgid/bokeh/118f754b-22c0-444d-a247-adcaba368af9%40continuum.io\.
> For more options, visit 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/086ed56d-ac2d-4e8e-9fc6-584fe885c2df%40continuum.io\.
For more options, visit https://groups.google.com/a/continuum.io/d/optout\.

This is how I do it:

  • make a dummy figure

  • plot any numbers of lines you need with their attributes

  • strip the figure from its useless renderers, You just need the glyphrenderers and legend

  • setup the legend renderer how you like,

  • make the glyphrenderers invisible

···

###############################################################################

Need to make a dummy figure to get the legend somewhere by itself …

dumx=range(10)

dumfig=figure(outline_line_alpha=0,plot_height=350,plot_width=150)

dumfig.line(dumx,dumx,color=‘purple’,line_width=2,legend=‘dum_test_1’)

dumfig.line(dumx,dumx,color=‘blue’,line_width=2,legend='dum_test_2 ')

dumfig.line(dumx,dumx,color=‘black’,line_width=2,legend=‘dum_test_3’)

dumfig.renderers=[rend for rend in dumfig.renderers if (type(rend)==bokeh.models.renderers.GlyphRenderer or type(rend)==bokeh.models.annotations.Legend)]

dumfig.renderers[0].border_line_alpha=0

dumfig.renderers[0].spacing=6

dumfig.renderers[0].location=‘top_left’

for rend in dumfig.renderers:

if type(rend)==bokeh.models.renderers.GlyphRenderer:

	rend.visible = False

###############################################################################

``

Then you just need to place the dumfig in your gridplot or other layout object.

Thank you very much Sébastien.
This was the only real solution that I could find to create consistent custom legends across multiple plots.

I wish it hadn’t taken me so long to figure this out…

···

On Friday, March 24, 2017 at 3:45:06 AM UTC+13, Sébastien Roche wrote:

This is how I do it:

  • make a dummy figure
  • plot any numbers of lines you need with their attributes
  • strip the figure from its useless renderers, You just need the glyphrenderers and legend
  • setup the legend renderer how you like,
  • make the glyphrenderers invisible

###############################################################################

Need to make a dummy figure to get the legend somewhere by itself …

dumx=range(10)

dumfig=figure(outline_line_alpha=0,plot_height=350,plot_width=150)

dumfig.line(dumx,dumx,color=‘purple’,line_width=2,legend=‘dum_test_1’)

dumfig.line(dumx,dumx,color=‘blue’,line_width=2,legend='dum_test_2 ')

dumfig.line(dumx,dumx,color=‘black’,line_width=2,legend=‘dum_test_3’)

dumfig.renderers=[rend for rend in dumfig.renderers if (type(rend)==bokeh.models.renderers.GlyphRenderer or type(rend)==bokeh.models.annotations.Legend)]

dumfig.renderers[0].border_line_alpha=0

dumfig.renderers[0].spacing=6

dumfig.renderers[0].location=‘top_left’

for rend in dumfig.renderers:

if type(rend)==bokeh.models.renderers.GlyphRenderer:

  rend.visible = False

###############################################################################

``

Then you just need to place the dumfig in your gridplot or other layout object.

Hi all,

Is it possible to link this ‘dummy’ figure legend to the ‘real’ plot so the user can click the legend to enable line visibility, for example? I believe I looked into this a few months ago but could not see a way to do it.

Thanks,
Collin

···

On Friday, August 18, 2017 at 7:09:08 AM UTC-6, Michael Exner-Kittridge wrote:

Thank you very much Sébastien.
This was the only real solution that I could find to create consistent custom legends across multiple plots.

I wish it hadn’t taken me so long to figure this out…

On Friday, March 24, 2017 at 3:45:06 AM UTC+13, Sébastien Roche wrote:

This is how I do it:

  • make a dummy figure
  • plot any numbers of lines you need with their attributes
  • strip the figure from its useless renderers, You just need the glyphrenderers and legend
  • setup the legend renderer how you like,
  • make the glyphrenderers invisible

###############################################################################

Need to make a dummy figure to get the legend somewhere by itself …

dumx=range(10)

dumfig=figure(outline_line_alpha=0,plot_height=350,plot_width=150)

dumfig.line(dumx,dumx,color=‘purple’,line_width=2,legend=‘dum_test_1’)

dumfig.line(dumx,dumx,color=‘blue’,line_width=2,legend='dum_test_2 ')

dumfig.line(dumx,dumx,color=‘black’,line_width=2,legend=‘dum_test_3’)

dumfig.renderers=[rend for rend in dumfig.renderers if (type(rend)==bokeh.models.renderers.GlyphRenderer or type(rend)==bokeh.models.annotations.Legend)]

dumfig.renderers[0].border_line_alpha=0

dumfig.renderers[0].spacing=6

dumfig.renderers[0].location=‘top_left’

for rend in dumfig.renderers:

if type(rend)==bokeh.models.renderers.GlyphRenderer:
  rend.visible = False

###############################################################################

``

Then you just need to place the dumfig in your gridplot or other layout object.

Hi,

So it seems like there are some reasonable use-cases around being able to have legends on different canvases that might be worth considering as new features. Or perhaps even just a matter of some convenience API to avoid having to jump through so many hoops. I'd suggest a GitHub issue is the best way to try and discuss and capture some of the requirements.

We do our best to provide capability but we definitely can't anticipate very use case users will come up with, so feedback and feature request issues are an essential part of prioritizing work and making improvements that are truly valuable.

Thanks,

Bryan

···

On Aug 18, 2017, at 08:34, cuxcrider <[email protected]> wrote:

Hi all,

Is it possible to link this 'dummy' figure legend to the 'real' plot so the user can click the legend to enable line visibility, for example? I believe I looked into this a few months ago but could not see a way to do it.

Thanks,
Collin

On Friday, August 18, 2017 at 7:09:08 AM UTC-6, Michael Exner-Kittridge wrote:
Thank you very much Sébastien.
This was the only real solution that I could find to create consistent custom legends across multiple plots.
I wish it hadn't taken me so long to figure this out...

On Friday, March 24, 2017 at 3:45:06 AM UTC+13, Sébastien Roche wrote:
This is how I do it:
- make a dummy figure
- plot any numbers of lines you need with their attributes
- strip the figure from its useless renderers, You just need the glyphrenderers and legend
- setup the legend renderer how you like,
- make the glyphrenderers invisible

###############################################################################
### Need to make a dummy figure to get the legend somewhere by itself ....
dumx=range(10)
dumfig=figure(outline_line_alpha=0,plot_height=350,plot_width=150)
dumfig.line(dumx,dumx,color='purple',line_width=2,legend='dum_test_1')
dumfig.line(dumx,dumx,color='blue',line_width=2,legend='dum_test_2 ')
dumfig.line(dumx,dumx,color='black',line_width=2,legend='dum_test_3')

dumfig.renderers=[rend for rend in dumfig.renderers if (type(rend)==bokeh.models.renderers.GlyphRenderer or type(rend)==bokeh.models.annotations.Legend)]
dumfig.renderers[0].border_line_alpha=0
dumfig.renderers[0].spacing=6
dumfig.renderers[0].location='top_left'
for rend in dumfig.renderers:
  if type(rend)==bokeh.models.renderers.GlyphRenderer:
    rend.visible = False
###############################################################################

Then you just need to place the dumfig in your gridplot or other layout object.

--
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/1eed8fdd-6101-4b82-bbc4-cd68d0fa69e9%40continuum.io\.
For more options, visit https://groups.google.com/a/continuum.io/d/optout\.

In the mean time, this seems to work fairly well, and is a bit simpler that the other code. I've left the second plot outline for clarity's sake but it could be removed easily.

    import numpy as np

    from bokeh.layouts import row
    from bokeh.models import Plot, Range1d
    from bokeh.plotting import figure, show, output_file

    x = np.linspace(0, 4*np.pi, 100)
    y = np.sin(x)

    TOOLS = "pan,wheel_zoom,box_zoom,reset,save,box_select"

    p1 = figure(title="Legend Example", tools=TOOLS)

    r1 = p1.circle(x, y, legend="sin(x)")
    r2 = p1.circle(x, 2*y, legend="2*sin(x)", color="orange")
    r3 = p1.circle(x, 3*y, legend="3*sin(x)", color="green")

    # adjust the ranges so that the glyphs will not be contained inside
    p2 = Plot(plot_width=200, plot_height=200,
              x_range=Range1d(1000, 1000),
              y_range=Range1d(1000, 1000),
              toolbar_location=None)

    legend = p1.legend[0]
    p2.renderers.append(legend)
    p2.renderers.extend([r1, r2, r3])
    p1.renderers.remove(legend)

    output_file("legend.html")

    show(row(p1, p2))

···

On Aug 18, 2017, at 08:56, Bryan Van de ven <[email protected]> wrote:

Hi,

So it seems like there are some reasonable use-cases around being able to have legends on different canvases that might be worth considering as new features. Or perhaps even just a matter of some convenience API to avoid having to jump through so many hoops. I'd suggest a GitHub issue is the best way to try and discuss and capture some of the requirements.

We do our best to provide capability but we definitely can't anticipate very use case users will come up with, so feedback and feature request issues are an essential part of prioritizing work and making improvements that are truly valuable.

Thanks,

Bryan

On Aug 18, 2017, at 08:34, cuxcrider <[email protected]> wrote:

Hi all,

Is it possible to link this 'dummy' figure legend to the 'real' plot so the user can click the legend to enable line visibility, for example? I believe I looked into this a few months ago but could not see a way to do it.

Thanks,
Collin

On Friday, August 18, 2017 at 7:09:08 AM UTC-6, Michael Exner-Kittridge wrote:
Thank you very much Sébastien.
This was the only real solution that I could find to create consistent custom legends across multiple plots.
I wish it hadn't taken me so long to figure this out...

On Friday, March 24, 2017 at 3:45:06 AM UTC+13, Sébastien Roche wrote:
This is how I do it:
- make a dummy figure
- plot any numbers of lines you need with their attributes
- strip the figure from its useless renderers, You just need the glyphrenderers and legend
- setup the legend renderer how you like,
- make the glyphrenderers invisible

###############################################################################
### Need to make a dummy figure to get the legend somewhere by itself ....
dumx=range(10)
dumfig=figure(outline_line_alpha=0,plot_height=350,plot_width=150)
dumfig.line(dumx,dumx,color='purple',line_width=2,legend='dum_test_1')
dumfig.line(dumx,dumx,color='blue',line_width=2,legend='dum_test_2 ')
dumfig.line(dumx,dumx,color='black',line_width=2,legend='dum_test_3')

dumfig.renderers=[rend for rend in dumfig.renderers if (type(rend)==bokeh.models.renderers.GlyphRenderer or type(rend)==bokeh.models.annotations.Legend)]
dumfig.renderers[0].border_line_alpha=0
dumfig.renderers[0].spacing=6
dumfig.renderers[0].location='top_left'
for rend in dumfig.renderers:
  if type(rend)==bokeh.models.renderers.GlyphRenderer:
    rend.visible = False
###############################################################################

Then you just need to place the dumfig in your gridplot or other layout object.

--
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/1eed8fdd-6101-4b82-bbc4-cd68d0fa69e9%40continuum.io\.
For more options, visit https://groups.google.com/a/continuum.io/d/optout\.

Hi Bryan,

Thanks for the input and suggestions. I used a similar code just somewhat reverse (first created the dummy plot with the appropriate renderers specifically for plotting then extended the renderer list for the real plot).

dummy figure - for legend consistency

p0 = figure(title=‘dummy Index’, tools=, logo=None, height=h, width=w)

p0.patches(‘x’, ‘y’, source=dummy_source, fill_color={‘field’: ‘cat’, ‘transform’: color_map}, line_color=“black”, line_width=1, legend=‘cat’)

p0.renderers = [i for i in p0.renderers if (type(i) == renderers.GlyphRenderer) | (type(i) == annotations.Legend)]

p0.renderers[1].visible = False

Figure 1 - precip

p1 = figure(title=‘Precipitation Index’, tools=TOOLS, logo=None, active_scroll=‘wheel_zoom’, plot_height=h, plot_width=w)

p1.patches(‘x’, ‘y’, source=precip_source, fill_color={‘field’: ‘cat’, ‘transform’: color_map}, line_color=“black”, line_width=1, fill_alpha=1)

p1.renderers.extend(p0.renderers)

I create 3 tabbed figures (not shown but all very similar to precip), so I wanted to make sure that the legend was consistent between them.

I’ll put in a github issue/request for something a bit more straightforward (although now that I know how to do it, it’s pretty straightforward to me now).

Thanks again.

···

On Saturday, August 19, 2017 at 2:23:46 AM UTC+12, Bryan Van de ven wrote:

In the mean time, this seems to work fairly well, and is a bit simpler that the other code. I’ve left the second plot outline for clarity’s sake but it could be removed easily.

import numpy as np



from bokeh.layouts import row

from bokeh.models import Plot, Range1d

from bokeh.plotting import figure, show, output_file



x = np.linspace(0, 4*np.pi, 100)

y = np.sin(x)



TOOLS = "pan,wheel_zoom,box_zoom,reset,save,box_select"



p1 = figure(title="Legend Example", tools=TOOLS)



r1 = p1.circle(x,   y, legend="sin(x)")

r2 = p1.circle(x, 2*y, legend="2*sin(x)", color="orange")

r3 = p1.circle(x, 3*y, legend="3*sin(x)", color="green")



# adjust the ranges so that the glyphs will not be contained inside
p2 = Plot(plot_width=200, plot_height=200,

          x_range=Range1d(1000, 1000),

          y_range=Range1d(1000, 1000),

          toolbar_location=None)



legend = p1.legend[0]

p2.renderers.append(legend)

p2.renderers.extend([r1, r2, r3])

p1.renderers.remove(legend)



output_file("legend.html")



show(row(p1, p2))

On Aug 18, 2017, at 08:56, Bryan Van de ven [email protected] wrote:

Hi,

So it seems like there are some reasonable use-cases around being able to have legends on different canvases that might be worth considering as new features. Or perhaps even just a matter of some convenience API to avoid having to jump through so many hoops. I’d suggest a GitHub issue is the best way to try and discuss and capture some of the requirements.

We do our best to provide capability but we definitely can’t anticipate very use case users will come up with, so feedback and feature request issues are an essential part of prioritizing work and making improvements that are truly valuable.

Thanks,

Bryan

On Aug 18, 2017, at 08:34, cuxcrider [email protected] wrote:

Hi all,

Is it possible to link this ‘dummy’ figure legend to the ‘real’ plot so the user can click the legend to enable line visibility, for example? I believe I looked into this a few months ago but could not see a way to do it.

Thanks,

Collin

On Friday, August 18, 2017 at 7:09:08 AM UTC-6, Michael Exner-Kittridge wrote:

Thank you very much Sébastien.

This was the only real solution that I could find to create consistent custom legends across multiple plots.

I wish it hadn’t taken me so long to figure this out…

On Friday, March 24, 2017 at 3:45:06 AM UTC+13, Sébastien Roche wrote:

This is how I do it:

  • make a dummy figure
  • plot any numbers of lines you need with their attributes
  • strip the figure from its useless renderers, You just need the glyphrenderers and legend
  • setup the legend renderer how you like,
  • make the glyphrenderers invisible

###############################################################################

Need to make a dummy figure to get the legend somewhere by itself …

dumx=range(10)

dumfig=figure(outline_line_alpha=0,plot_height=350,plot_width=150)

dumfig.line(dumx,dumx,color=‘purple’,line_width=2,legend=‘dum_test_1’)

dumfig.line(dumx,dumx,color=‘blue’,line_width=2,legend='dum_test_2 ')

dumfig.line(dumx,dumx,color=‘black’,line_width=2,legend=‘dum_test_3’)

dumfig.renderers=[rend for rend in dumfig.renderers if (type(rend)==bokeh.models.renderers.GlyphRenderer or type(rend)==bokeh.models.annotations.Legend)]

dumfig.renderers[0].border_line_alpha=0

dumfig.renderers[0].spacing=6

dumfig.renderers[0].location=‘top_left’

for rend in dumfig.renderers:

    if type(rend)==bokeh.models.renderers.GlyphRenderer:
            rend.visible = False

###############################################################################

Then you just need to place the dumfig in your gridplot or other layout object.


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/1eed8fdd-6101-4b82-bbc4-cd68d0fa69e9%40continuum.io.

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