Bokeh Tutorial

00. Introduction and Setup

What is Bokeh

Bokeh is an interactive visualization library that targets modern web browsers for presentation. It is good for:

  • Interactive visualization in modern browsers
  • Standalone HTML documents, or server-backed apps
  • Expressive and versatile graphics
  • Large, dynamic or streaming data
  • Easy usage from python (or Scala, or R, or...)

And most importantly:


The goal of Bokeh is to provide elegant, concise construction of novel graphics in the style of D3.js, from the comfort of high level languages such as Python, and to extend this capability with high-performance interactivity over very large or streaming datasets. Bokeh can help anyone who would like to quickly and easily create interactive plots, dashboards, and data applications.

What can I do with Bokeh

In [1]:
# Standard imports 

from import output_notebook, show
Loading BokehJS ...
In [2]:
# Plot a complex chart with intearctive hover in a few lines of code

from bokeh.models import ColumnDataSource, HoverTool
from bokeh.plotting import figure
from bokeh.sampledata.autompg import autompg_clean as df
from bokeh.transform import factor_cmap

df.cyl = df.cyl.astype(str)
df.yr = df.yr.astype(str)

group = df.groupby(('cyl', 'mfr'))
source = ColumnDataSource(group)

p = figure(plot_width=800, plot_height=300, title="Mean MPG by # Cylinders and Manufacturer",
           x_range=group, toolbar_location=None, tools="")

p.xgrid.grid_line_color = None
p.xaxis.axis_label = "Manufacturer grouped by # Cylinders"
p.xaxis.major_label_orientation = 1.2

index_cmap = factor_cmap('cyl_mfr', palette=['#2b83ba', '#abdda4', '#ffffbf', '#fdae61', '#d7191c'], 
                         factors=sorted(df.cyl.unique()), end=1)

p.vbar(x='cyl_mfr', top='mpg_mean', width=1, source=source,
       line_color="white", fill_color=index_cmap, 
       hover_line_color="black", hover_fill_color=index_cmap)

p.add_tools(HoverTool(tooltips=[("MPG", "@mpg_mean"), ("Cyl, Mfr", "@cyl_mfr")]))

In [3]:
# Create and deploy interactive data applications

from IPython.display import IFrame
IFrame('', width=900, height=500)

Getting set up

In [4]:
from IPython.core.display import Markdown

Clone or download the repo

First get local copies of the tutorial notebooks:

$ git clone

Or download from:

Install the dependencies

This tutorial has been tested on:

  • bokeh 0.12.7
  • pandas 0.20.3
  • notebook 5.0.0
  • phantomjs 2.1.1
  • pillow 4.2.1
  • selenium 3.5.0

Other combinations may work also.

The quickest, easiest way to install is to use Anaconda (or Miniconda):

Installing with anaconda

Install anaconda

Anaconda should come with all the dependencies included, but you may need to update your versions.

Installing with miniconda

Install miniconda.

Use the command line to create an environment and install the packages:

$ conda env create
$ source activate bokeh-notebooks

NOTE: Run this in the tutorial directory where environment.yml file is.

Once you've got a base install, you can install the remaining dependencies with:

conda install phantomjs pillow selenium

Get the sample data

Bokeh has a sample data download that gives us some data to build demo visualizations. To get it run the following command at your command line:

$ bokeh sampledata

Install Datashader and Holoviews (optional)

Some optional sections require the additional packages Flask, Datashader, and Holoviews. These can be installed with:

$ conda install -c datashader holoviews flask

Run the Jupyter notebook

From this folder run jupyter notebook, and open the 00 - Introduction and Setup.ipynb notebook.

$ jupyter notebook

Setup-test, run the next cell. Hopefully you should see output that looks something like this:

IPython - 6.1.0
Pandas - 0.20.3
Bokeh - 0.12.7

If this isn't working for you, see the in this directory.

In [5]:
from IPython import __version__ as ipython_version
from pandas import __version__ as pandas_version
from bokeh import __version__ as bokeh_version
print("IPython - %s" % ipython_version)
print("Pandas - %s" % pandas_version)
print("Bokeh - %s" % bokeh_version)
IPython - 6.1.0
Pandas - 0.20.3
Bokeh - 0.12.7