Streaming two line graphs using bokeh

13,372

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.

Share:
13,372
jtitusj
Author by

jtitusj

Updated on July 27, 2022

Comments

  • jtitusj
    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
    bigreddot almost 8 years
    For 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, the trigger calls are not necessary, the Bokeh server will pick up changes to entire properties automagically.
  • Alex Poca
    Alex Poca over 7 years
    How is it possible to show only the last X points instead of squeezing all the dataset?
  • bigreddot
    bigreddot almost 7 years
    .stream accepts a rollover parameter that says how many points to keep at max, before dropping points.
  • Tommy
    Tommy over 6 years
    is 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
    Tommy over 6 years
    nice addition to the above answer.
  • Tommy
    Tommy over 6 years
    What 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
    Admin about 5 years
    I 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?