Reputation: 5639
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
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