Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

load graph data from files on button click with bokeh

I'm trying to use toggle buttons in Bokeh to create an interactive website where a user can click toggle buttons to select which graphs are plotted.

The buttons would load data from a text file (containing two columns x and y data). the data files have two columns containing x and y data separated by a space.

When the toggle buttons are selected then the corresponding data would be plotted, the plot would be removed when the toggle button is deselected.

I'm currently having trouble passing an argument to the callback event, is it possible?

from bokeh.io import vform
from bokeh.models import CustomJS, ColumnDataSource
from bokeh.models.widgets import Toggle
from bokeh.plotting import figure, output_file, show

output_file("load_data_buttons.html")

x = [0]
y = x

source = ColumnDataSource(data=dict(x=x, y=y))

plot = figure(plot_width=400, plot_height=400)
plot.line('x', 'y', source=source, line_width=3, line_alpha=0.6)

callback = CustomJS(args=filename,dict(source=source), code="""
        var data = source.get('data');
        console.log(filename)
        x = data['x']
        y = data['y']
        #load data stored in the file name and assign to x and y
        source.trigger('change');
    """)

toggle1 = Toggle(label="Load data file 1", type="success",callback=callback("data_file_1.txt"))
toggle2 = Toggle(label="Load data file 2", type="success",callback=callback("data_file_2.txt"))

layout = vform(toggle1, toggle2, plot)

show(layout)
like image 707
Jon Avatar asked Jan 08 '16 15:01

Jon


1 Answers

You should load the two file and save the data into a DataSource object, here is an example:

from bokeh.io import vplot
import pandas as pd
from bokeh.models import CustomJS, ColumnDataSource
from bokeh.models.widgets import Button
from bokeh.plotting import figure, output_file, show

output_file("load_data_buttons.html")

df1 = pd.read_csv("data_file_1.txt")
df2 = pd.read_csv("data_file_2.txt")

plot = figure(plot_width=400, plot_height=400)

source = ColumnDataSource(data=dict(x=[0, 1], y=[0, 1]))
source2 = ColumnDataSource(data=dict(x1=df1.x.values, y1=df1.y.values, 
                                    x2=df2.x.values, y2=df2.y.values))

plot.line('x', 'y', source=source, line_width=3, line_alpha=0.6)

callback = CustomJS(args=dict(source=source, source2=source2), code="""
        var data = source.get('data');
        var data2 = source2.get('data');
        data['x'] = data2['x' + cb_obj.get("name")];
        data['y'] = data2['y' + cb_obj.get("name")];
        source.trigger('change');
    """)

toggle1 = Button(label="Load data file 1", callback=callback, name="1")
toggle2 = Button(label="Load data file 2", callback=callback, name="2")

layout = vplot(toggle1, toggle2, plot)

show(layout)
like image 90
HYRY Avatar answered Sep 20 '22 16:09

HYRY