Streaming two line graphs using bokeh
Solution 1
For bokeh-0.11.1
:
Basically, you need to run you python app in the bokeh server. Then anyone can connect to the server and view the graph in realtime.
First, write your program. Use this code for example:
# myplot.py
from bokeh.plotting import figure, curdoc
from bokeh.driving import linear
import random
p = figure(plot_width=400, plot_height=400)
r1 = p.line([], [], color="firebrick", line_width=2)
r2 = p.line([], [], color="navy", line_width=2)
ds1 = r1.data_source
ds2 = r2.data_source
@linear()
def update(step):
ds1.data['x'].append(step)
ds1.data['y'].append(random.randint(0,100))
ds2.data['x'].append(step)
ds2.data['y'].append(random.randint(0,100))
ds1.trigger('data', ds1.data, ds1.data)
ds2.trigger('data', ds2.data, ds2.data)
curdoc().add_root(p)
# Add a periodic callback to be run every 500 milliseconds
curdoc().add_periodic_callback(update, 500)
Then run the server from the command line, with your program:
C:\>bokeh serve --show myplot.py
This will open the browser with your realtime graph.
For all the details see the bokeh server documentation.
Solution 2
You can add scrolling to your graph by adding the following to the plot figure declaration:
p = figure(plot_width=400, plot_height=400)
p.x_range.follow="end"
p.x_range.follow_interval = 20
p.x_range.range_padding=0
where the follow_interval = the number of points that accumulate on the on the graph before it starts scrolling. I believe you can set the visible range on the chart, as well. FYI I got the scrolling code from the OHLC example on the bokeh GitHub page found here: https://github.com/bokeh/bokeh/tree/master/examples/app The OHLC is an example of streaming data using the "...= new_data" technique that bigreddot mentioned.
jtitusj
Updated on July 27, 2022Comments
-
jtitusj almost 2 years
I want to create a visualization where there are two line graphs that are updated with one new point per line graph per second.
I have recently read about bokeh and found out that it can be used in visualizing streams of data in real-time. However, I don't know how to code in it yet.
I would appreciate it if someone can show me how this task can be done using bokeh. Thanks!
-
bigreddot almost 8 yearsFor fairly obtuse technical reasons, it is often preferred to update the entire
.data
attribute "at once" i.e.ds.data = new_data
if you can. Also if you do it that way, thetrigger
calls are not necessary, the Bokeh server will pick up changes to entire properties automagically. -
Alex Poca over 7 yearsHow is it possible to show only the last X points instead of squeezing all the dataset?
-
bigreddot almost 7 years
.stream
accepts arollover
parameter that says how many points to keep at max, before dropping points. -
Tommy over 6 yearsis there a way to add "windowing" to this example? If you run this, the graph gets more and more jammed with data, the axis windows don't automatically adjust. EDIT: nevermind I see Alan's answer below extends this example.
-
Tommy over 6 yearsnice addition to the above answer.
-
Tommy over 6 yearsWhat does
trigger
do here? I found the link to their source, and documentation, but the docstring is blank: bokeh.pydata.org/en/latest/docs/reference/model.html -
Admin about 5 yearsI know it's old answer but I would appreciate some help - if I were to open <serverIP>:5006/myplot in browser and after some time open the same address in next tab I would get two independent, different plots in two tabs. How can I make plot persistent over different tabs?