Brandt
Brandt

Reputation: 5639

Write down Bokeh plot selected data not working

I am trying to write the selected datapoints from a Bokeh plot. The idea is to access ColumnDataSource selected property to get the selected data points whenever the Button is clicked.

Below goes a model of the functionality I'm trying to achieve.

Expectation: after clicking the 'Selected points' button, a file /tmp/datapoints.json would be created containing the list of points selected (if any).

Reality: no /tmp/datapoints.json.

from bokeh.io import curdoc
from bokeh.plotting import figure
from bokeh.io import show
from bokeh.models import ColumnDataSource, Button
from bokeh.layouts import column

# setup plot
fig = figure(title='Select points',
            plot_width=300, plot_height=200)

import numpy as np
x = np.linspace(0,10,100)
y = np.random.random(100) + x

import pandas as pd
data = pd.DataFrame(dict(x=x, y=y))

# define data source
src = ColumnDataSource(data)

# define plot
fig.circle(x='x', y='y', source=src)

# define interaction
def print_datapoints(attr, old, new):
    with open('/tmp/datapoints.json', 'w') as f:
        import json
        json.dump(src.selected, f)

btn = Button(label='Selected points', button_type='success')
btn.on_click(print_datapoints)

curdoc().add_root(column(btn,fig))

What am I missing?

Thanks.

Upvotes: 1

Views: 936

Answers (1)

Joris
Joris

Reputation: 1188

with the lasso_select tool you can work it like this:

from bokeh.io import curdoc
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource, Button
from bokeh.layouts import column

# setup plot
tools = "pan,wheel_zoom,lasso_select,reset"
fig = figure(title='Select points',
            plot_width=300, plot_height=200,tools=tools)

import numpy as np
x = np.linspace(0,10,100)
y = np.random.random(100) + x

import pandas as pd
data = pd.DataFrame(dict(x=x, y=y))

# define data source
src = ColumnDataSource(data)

# define plot
fig.circle(x='x', y='y', source=src)

# define interaction
def print_datapoints():
    indices=src.selected['1d']['indices']
    results=data.iloc[indices]
    resultsDict=results.to_dict()['x']
    resultString=str(resultsDict)
    with open('tmp/datapoints.json', 'w') as f:
        import json
        json.dump(resultString, f)

btn = Button(label='Selected points', button_type='success')
btn.on_click(print_datapoints)

curdoc().add_root(column(btn,fig))

To make the json.dump work i had to remove the first '/' from '/tmp/datapoints.json' .

Upvotes: 1

Related Questions